如何在我的程序中保存一组单选按钮的状态?

Posted

技术标签:

【中文标题】如何在我的程序中保存一组单选按钮的状态?【英文标题】:How can I save the state of a group of Radio Buttons in my program? 【发布时间】:2013-05-06 17:45:07 【问题描述】:

我有两组单选按钮(2 组 4 个按钮),我想在程序/主窗体加载后立即保存检查状态并加载检查状态。单选按钮NOT在主窗体上。

如何使用 Properties.Settings 执行此操作?

“偏好”表单上的代码如下:

public string DataFormat, KeyboardFormat;

public void UpdateUserChoice(string date, string keyboard)
    
        if (date == ddmmyyyy.Text)
            ddmmyyyy.Checked = true;
        else if (date == mmddyyyy.Text)
            mmddyyyy.Checked = true;
        else if (date == yyyyddmm.Text)
            yyyyddmm.Checked = true;
        else if (date == yyyymmdd.Text)
            yyyymmdd.Checked = true;
        //----------------------------------------------------------
        if (keyboard == qwerty.Text)
            qwerty.Checked = true;
        else if (keyboard == qwertz.Text)
            qwertz.Checked = true;
        else if (keyboard == azerty.Text)
            azerty.Checked = true;
        else if (keyboard == dvorak.Text)
            dvorak.Checked = true;
    

    private void button1_Click(object sender, EventArgs e)
    
        if (ddmmyyyy.Checked)
            DataFormat = ddmmyyyy.Text;
        else if (mmddyyyy.Checked)
            DataFormat = mmddyyyy.Text;
        else if (yyyyddmm.Checked)
            DataFormat = yyyyddmm.Text;
        else if (yyyymmdd.Checked)
            DataFormat = yyyymmdd.Text;
        //--------------------------------------------------
        if (qwerty.Checked)
            KeyboardFormat = qwerty.Text;
        else if (qwertz.Checked)
            KeyboardFormat = qwertz.Text;
        else if (azerty.Checked)
            KeyboardFormat = azerty.Text;
        else if (dvorak.Checked)
            KeyboardFormat = dvorak.Text;
        this.Close();
    

而MainForm上的代码是:

private void DateStamp()
    
        if (dateFormat.ToUpper() == "DD/MM/YYYY")
        
            int CaretPosition = richTextBoxPrintCtrl1.SelectionStart;
            string TextBefore = richTextBoxPrintCtrl1.Text.Substring(0, CaretPosition);
            string textAfter = richTextBoxPrintCtrl1.Text.Substring(CaretPosition);
            string currentDate = DateTime.Now.ToString("dd-MM-yyyy");
            richTextBoxPrintCtrl1.SelectedText = currentDate;
        
        else if (dateFormat.ToUpper() == "MM/DD/YYYY")
        
            int CaretPosition = richTextBoxPrintCtrl1.SelectionStart;
            string TextBefore = richTextBoxPrintCtrl1.Text.Substring(0, CaretPosition);
            string textAfter = richTextBoxPrintCtrl1.Text.Substring(CaretPosition);
            string currentDate = DateTime.Now.ToString("MM-dd-yyyy");
            richTextBoxPrintCtrl1.SelectedText = currentDate;
        
        else if (dateFormat.ToUpper() == "YYYY/DD/MM")
        
            int CaretPosition = richTextBoxPrintCtrl1.SelectionStart;
            string TextBefore = richTextBoxPrintCtrl1.Text.Substring(0, CaretPosition);
            string textAfter = richTextBoxPrintCtrl1.Text.Substring(CaretPosition);
            string currentDate = DateTime.Now.ToString("yyyy-dd-MM");
            richTextBoxPrintCtrl1.SelectedText = currentDate;
        
        else if (dateFormat.ToUpper() == "YYYY/MM/DD")
        
            int CaretPosition = richTextBoxPrintCtrl1.SelectionStart;
            string TextBefore = richTextBoxPrintCtrl1.Text.Substring(0, CaretPosition);
            string textAfter = richTextBoxPrintCtrl1.Text.Substring(CaretPosition);
            string currentDate = DateTime.Now.ToString("yyyy-MM-dd");
            richTextBoxPrintCtrl1.SelectedText = currentDate;

private void preferencesToolStripMenuItem_Click(object sender, EventArgs e)
    
        UserPreferences pref = new UserPreferences();
        pref.UpdateUserChoice(dateFormat, keyboardFormat);
        pref.ShowDialog();
        dateFormat = pref.DataFormat;
        keyboardFormat = pref.KeyboardFormat;
    


    private void virtualKeyboardToolStripMenuItem1_Click(object sender, EventArgs e)
    
        if (keyboardFormat.ToUpper() == "QWERTY")
        
            Virtual_Keyboard vKeyboard = new Virtual_Keyboard();
            vKeyboard.Show();
        
        else if (keyboardFormat.ToUpper() == "QWERTZ")
        
            QWERTZ qwertz = new QWERTZ();
            qwertz.Show();
        
        else if (keyboardFormat.ToUpper() == "AZERTY")
        
            AZERTY azerty = new AZERTY();
            azerty.Show();
        
        else if (keyboardFormat.ToUpper() == "DVORAK")
        
            DVORAK dvorak = new DVORAK();
            dvorak.Show();
        
        

我想保存单选按钮的选中状态(如附图所示),这样当用户重新打开程序时,这些“设置”也会被加载。我将如何实现这一目标?如果可能,请使用 Properties.Settings。

我创建了两个“设置”。日期偏好和键盘偏好。我也不知道他们应该是什么“类型”。如果有人可以指导我,我将非常感激。我是编程新手,非常感谢您的帮助。

单选按钮被命名为:

ddmmyyy 呸呸呸 yyyyddmm yyyymmdd

qwerty qwertz 艾泽蒂 德沃夏克

感谢您的帮助。

--编辑--

我忘了说这是一个 WinForms 应用程序。

【问题讨论】:

如果没有更好的办法,可以给控件命名,然后保存选中控件的名称,然后启用选中控件。 (注意:不是显示的文字) 我该怎么做? 我很抱歉,因为我不在带有 Visual Studio 的计算机上,所以不能给出一个实际的例子(因此评论不回答)。但是您创建了一种将设置保存到文件的方法(不确定如何使用 property.settings 抱歉),然后您找到所选名称的单选按钮(radioButton.checked 是所选名称),然后保存该名称( radioButton.name) 我没有收到你的UpdateUserChoice。是在您加载偏好表单时吗? @AdrienLacroix 是的。它加载了用户在会话期间选择的选项。但是当程序关闭时它不会记住这些。 【参考方案1】:

日期示例(您可以对键盘执行相同操作):

也许你可以像这样创建一个枚举:

public enum DatePreference  dd_mm_yyyy, mm_dd_yyyy, yyyy_dd_mm, yyyy_mm_dd ;

在设置中设置DatePreference为整数

对于您的偏好表单代码:

更新用户选择:

if (Properties.Settings.Default.DatePreference == (int)DatePreference.dd_mm_yyyy)
    ddmmyyyy.Checked = true;

button1_Click :

if (ddmmyyyy.Checked)

    DataFormat = ddmmyyyy.Text;
    Properties.Settings.Default.DatePreference = (int)DatePreference.dd_mm_yyyy;

想用Properties.Settings.Default.Save(); 保存更改!

对于您的 Main 表单代码:

    if (Properties.Settings.Default.DatePreference == (int)DatePreference.dd_mm_yyyy)
    
        int CaretPosition = richTextBoxPrintCtrl1.SelectionStart;
        string TextBefore = richTextBoxPrintCtrl1.Text.Substring(0, CaretPosition);
        string textAfter = richTextBoxPrintCtrl1.Text.Substring(CaretPosition);
        string currentDate = DateTime.Now.ToString("dd-MM-yyyy");
        richTextBoxPrintCtrl1.SelectedText = currentDate;
    
    [...]

【讨论】:

对不起。正如我所说,我是编程新手,所以这让我有点困惑。你能解释一下吗? 当然,你有什么不明白的? 好吧,总的来说,我很难理解如何正确实现这一点。我已将这两个设置更改为“int”并添加了“enum DatePreference”,但我不明白其余部分的操作。 对不起。我是编程新手,所以这都是一次学习经历。 没问题。很高兴我能帮上忙 :) 我刚刚更改了您的 if 条件。例如,在您的主表单中:if (dateFormat.ToUpper() == "DD/MM/YYYY") => if (Properties.Settings.Default.DatePreference == (int)DatePreference.dd_mm_yyyy) 其他日期相同【参考方案2】:

我会在一个枚举中表示这些值。

    public enum AvailableKeyboardLayouts
    
        DVORAK = 0,
        QWERTY = 1,
        QWERTZ = 2
    

使用设置文件,您可以将类型保存为字符串或整数。使用 Enum.Parse 转换对象

从设置文件保存和加载很容易:

我的设置文件是 Settings.settings

Settings.Default.KeyboardPreference = AvailableKeyboardLayouts.DVORAK;
Settings.Default.Save();

【讨论】:

你也有同样的想法;)【参考方案3】:

如何使用 Resources.resx 文件(取决于项目) 您也可以使用 xml 文件来保存值。如果您有很多设置,那么您可以使用 Datatable(例如命名为“Settings”),将其放在 Dataset 中并使用 SaveToXml 和 LoadFromXml 以获得更快的结果。

【讨论】:

这篇文章将为您提供帮助:link 同样对于单选按钮,您可以为每个组创建一个 Enum 并将其作为整数保存到设置文件中,这样您就会知道 0 是 gor QWERTY , 1对于 QWERTZ 等。您将在表单的关闭事件中保存并在加载的事件中加载。希望对您有所帮助。

以上是关于如何在我的程序中保存一组单选按钮的状态?的主要内容,如果未能解决你的问题,请参考以下文章

制作一组单选按钮 [VB.NET]

如何在 Flutter 中只选择一组单选按钮的值?

一行中的一组单选按钮,同时选择一行中的一个单选按钮,它会影响另一行目标-c

使用 RadioButtonFor 编码一组单选按钮的正确方法

如何指示需要一组单选按钮[重复]

在 WinForms 中对一组单选按钮进行数据绑定的最佳方法