[英]How to persist the selection of an item in a combo box between application restarts
在 WinForms 應用程序中,我在組合框中顯示了所有可用音頻設備的列表。 我希望用戶能夠 select 其中一項並保留該選擇,以便下次從組合框中加載應用程序時默認選擇相同的設備。
我該如何解決這個問題?
獲取可用音頻設備列表的代碼:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp2
{
public partial class Form2 : Form
{
[DllImport("winmm.dll", SetLastError = true)]
static extern uint waveInGetNumDevs();
[DllImport("winmm.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern uint waveInGetDevCaps(uint hwo, ref WAVEOUTCAPS pwoc, uint cbwoc);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct WAVEOUTCAPS
{
public ushort wMid;
public ushort wPid;
public uint vDriverVersion;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string szPname;
public uint dwFormats;
public ushort wChannels;
public ushort wReserved1;
public uint dwSupport;
}
public void FillSoundDevicesInCombobox()
{
uint devices = waveInGetNumDevs();
WAVEOUTCAPS caps = new WAVEOUTCAPS();
for (uint i = 0; i < devices; i++)
{
waveInGetDevCaps(i, ref caps, (uint)Marshal.SizeOf(caps));
CB1.Items.Add(caps.szPname);
}
}
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
FillSoundDevicesInCombobox();
}
private void button1_Click(object sender, EventArgs e)
{
}
}
}
我的期望是,當用戶單擊按鈕時,所選項目將被保存。 然后,如果我重新啟動應用程序,則應在加載表單時重新選擇相同的設備。
我將忽略麥克風問題,而是解決真正的潛在問題:
在 WinForms 應用程序中執行此操作的最簡單方法是使用應用程序設置:
Windows Forms 的應用程序設置
Windows Forms 的應用程序設置功能可以輕松地在客戶端上創建、存儲和維護自定義應用程序和用戶首選項。 使用應用程序設置,您不僅可以存儲數據庫連接字符串等應用程序數據,還可以存儲特定於用戶的數據,例如工具欄位置和最近使用的列表。
對於您的方案,我們希望專注於用戶范圍的設置,因為這些設置可以在運行時進行編輯並保存回文件,以便可以在應用程序啟動時讀取更改。
操作方法:在設計時創建新設置
您可以在設計時使用 Visual Studio 中的設置設計器創建新設置。 設置設計器是一個網格樣式的界面,允許您創建新設置並為這些設置指定屬性。 您必須為新設置指定名稱、值、類型和 Scope。 創建設置后,即可在代碼中訪問它。
一旦定義了您的設置,我們就可以在代碼中使用它。 在這種情況下,我不存儲索引,而是使用實際值。 這是如果在將來的執行中為麥克風加載的值不同或以不同的順序,代碼仍將 select 正確的麥克風,或根本沒有。
我們可以通過Properties.Settings.Default
命名空間訪問應用程序設置:
private void Form2_Load(object sender, EventArgs e)
{
FillSoundDevicesInCombobox();
// Only select the device if there is a value to load
if (!String.IsNullOrWhiteSpace(Properties.Settings.Default.SelectedAudioDevice))
{
// find the device, matching on the value, not index
var item = CB1.Items.Cast<string>().FirstOrDefault(x => x.Equals(Properties.Settings.Default.SelectedAudioDevice));
// only select the device if we found one that matched the previous selection.
if (item != null)
CB1.SelectedItem = item;
}
}
然后在按鈕點擊中,我們可以存儲當前的選擇:
如何:使用 C# 在運行時編寫用戶設置
應用程序范圍的設置是只讀的,只能在設計時或通過在應用程序會話之間更改 .config 文件來更改。 但是,用戶范圍的設置可以在運行時編寫,就像您更改任何屬性值一樣。 新值在應用程序 session 的持續時間內保持不變。 您可以通過調用 Save 方法在應用程序會話之間保留對設置的更改。
private void button1_Click(object sender, EventArgs e)
{
// persist the changes to the user scoped settings store
Properties.Settings.Default.SelectedAudioDevice = CB1.SelectedItem?.ToString();
Properties.Settings.Default.Save();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.