簡體   English   中英

如何在應用程序重新啟動之間保持組合框中的項目選擇

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM