使用应用程序设置存储WinForms单选按钮的Checked属性

时间:2009-06-01 23:21:00

标签: .net vb.net winforms radio-button

我有一个WinForms对话框,其中包含3个单选按钮。我正在使用ApplicationSettings来绑定每个RadioButton控件的Checked属性,但它没有做我期望它做的事情。现在我必须先点击每个单选按钮两次才能检查它并且所选的单选按钮没有被保留。

关闭表单时是否需要执行一行代码来保存用户设置?

如何消除2倍点击单选按钮的需要?

是否有更好的方法来保留此类用户设置?我在对话框类上有一个公共属性,它根据选中的单选按钮获取/设置枚举值,但我没有看到将该属性绑定到用户设置的简单方法。

编辑:应该指定我正在使用vb.net。我认为这意味着My.Settings而不是Properties.Settings

4 个答案:

答案 0 :(得分:6)

我回答你问题的这一部分:

  

如何消除2倍点击单选按钮的需要?

您可以将以下事件处理程序添加到GroupBox中三个RadioButton(其中Checked属性绑定到应用程序设置)中的每一个的Click事件:

Private Sub RadioButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tomRadioButton.Click, dickRadioButton.Click, harryRadioButton.Click
    If sender.Checked = False Then
        sender.Checked = True
    End If
End Sub

它很有效,即使单击它后检查一个未检查的RadioButton需要半秒钟。

两年前(2008年)在湍流互动博客{感谢Surviving WinForms Databindingohadsc帖子的第5部分(2008年)解释了问题的原因:

  

规则5:不要绑定到可点击的单选按钮

     

我知道如果你有多好   可以绑定你的收音机   枚举属性的按钮。我真的   做。你认为你只是去   挂钩一些Format和Parse事件   翻译回你的枚举,和   一切都会好起来。真是太糟糕了   方便,如果它确实有效。但   WinForms并没有因此而被切断。   现在有3个完整版本(或者是3.5版)   发布?),情况一直如此。   这是因为事件顺序,这是   不是MS可以去的东西   切换而不会造成数千人   让开发人员真正变得干酪   关闭。

     

这个问题真的归结为   与其他控制数据不同的事实   属性,a的Checked属性   单选按钮实际上没有改变   直到焦点离开单选按钮。   和所有WinForms控件一样   焦点实际上并没有离开收音机   按钮,直到焦点给予   另一个控制,事实上直到   在新的Click事件之后   集中控制已经解雇。结果   其中,因为它涉及无线电   按钮,如果你试图绑定到   他们,你的绑定属性   数据源实际上会落后于你的   单选按钮的视觉状态   点击即可。如果你只有两个收音机   按钮,数据源将是   正好与可见状态相反,   直到你点击其他地方   不触发那个动作   引用那些数据源   属性。哪个可以做到这一点   真正令人愤怒的bug追查。   我几乎以为我是幻觉。

     

现在,说实话,这是可能的   让它起作用。但它是最愚蠢的   曾经克服的kludge。好吧也许吧   它不是那么糟糕......但它是一个混乱的   黑客肯定。这需要很多工作   对于真正需要的东西   已经可用了。尽可能接近我   告诉,解决这个问题的唯一方法   没有放弃的问题   数据绑定机制是   基本上制作自己的RadioButton   控制,财产变化和   事件顺序实际上有用。   你可以从头写一个,   或子类RadioButton和覆盖   所有具有自定义的事件逻辑   消息处理。

答案 1 :(得分:6)

感谢Geoffrey Van Wyk和ohadsc(链接),我提出了以下自定义控件。它基本上是一个自定义框架,将自动在其中包含的所有单选按钮上实现Geoffrey的代码。优点是您现在可以使用ApplicationSettings绑定控件的checked属性,它将按预期工作。

这是我的c#代码来制作自定义控件:

 public partial class RadioPanel : System.Windows.Forms.Panel
    {
        protected override void OnControlAdded(ControlEventArgs e)
        {
            base.OnControlAdded(e);
            var radioButton = e.Control as RadioButton;
            if (radioButton != null)
                radioButton.Click += radioButton_Click;
        }

        void radioButton_Click(object sender, EventArgs e)
        {
            var radio = (RadioButton)sender;
            if (!radio.Checked)
                radio.Checked = true;
        }

    }

答案 2 :(得分:3)

我可以回答你问题的这一部分:

  

关闭表单时是否需要执行一行代码来保存用户设置?

应用程序设置存储在SettingsProperties命名空间中。 Settings类有一个名为Default的静态属性,它表示应用程序的当前设置。所以在你的主要表格的闭幕活动中,你打电话:

Properties.Settings.Default.Save();

...保存设置。

同样,您可以使用设置的名称以编程方式进入设置:Properties.Settings.Default.MyRadioButtonState(或您所谓的任何名称)。

答案 3 :(得分:3)