繁体   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