【问题标题】:Using ApplicationSettings to store Checked property for WinForms RadioButtons使用应用程序设置存储 WinForms 单选按钮的 Checked 属性
【发布时间】:2010-10-30 13:15:41
【问题描述】:

我有一个包含 3 个单选按钮的 WinForms 对话框。我正在使用ApplicationSettings 绑定每个RadioButton 控件的Checked 属性,但它并没有达到我期望的效果。现在我必须在每个单选按钮被选中之前单击它两次,并且选定的单选按钮不会被保留。

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

如何消除两次单击单选按钮的需要?

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

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

【问题讨论】:

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


    【解决方案1】:

    我回答你的这部分问题:

    如何消除两次单击单选按钮的需要?

    您可以将以下事件处理程序添加到 GroupBox 中三个 RadioButtons(其中 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 年)Turbulent Intelect 博客上Surviving WinForms Databinding 帖子的第 5 部分解释了问题的原因(感谢ohadsc,提供链接):

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

    我知道如果你 可以绑定你的一堆收音机 枚举属性的按钮。我真的 做。你认为你只是去 连接一些 Format 和 Parse 事件 翻译回你的枚举,和 一切都会好起来。会很糟糕的 方便,如果它确实有效。但 WinForms 不适合这个。 现在有 3 个完整版本(或者是 3.5 发布?),情况就是这样。 这是因为事件顺序, 不是MS可以去的 切换而不会导致数千 的开发人员得到真正的奶酪 关闭。

    问题真的归结为 事实上,与其他控件的数据不同 属性,a 的 Checked 属性 单选按钮实际上并没有改变 直到焦点离开单选按钮。 与所有 WinForms 控件一样, 焦点实际上并没有离开收音机 按钮直到获得焦点后 另一个控件,实际上直到 在新的 Click 事件之后 集中控制已经开火。结果 其中,因为它与无线电有关 按钮,如果您尝试绑定到 他们,你的绑定属性 数据源实际上会滞后于您的 单选按钮的视觉状态加一 点击。如果你只有两个收音机 按钮,数据源将是 与可见状态完全相反, 直到你点击其他地方 不会触发一个动作 引用那些数据源 特性。这可以使 真正令人愤怒的错误要追查。 我差点以为自己出现幻觉了。

    现在,老实说,有可能 让它起作用。但它是最笨的 曾经结块的结块。好吧也许 没那么糟糕……但它很乱 黑客肯定。这需要很多工作 对于真正应该做的事情 已经可用。尽可能靠近 告诉,解决这个问题的唯一方法 问题而不放弃 数据绑定机制是 基本上制作自己的 RadioButton 控制,具有属性的变化和 实际有用的事件顺序。 你可以从头开始写一个, 或子类 RadioButton 并覆盖 自定义的所有事件逻辑 消息处理。

    【讨论】:

      【解决方案2】:

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

      这是我制作自定义控件的 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;
              }
      
          }
      

      【讨论】:

        【解决方案3】:

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

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

        应用程序设置存储在Settings 类中的Properties 命名空间中。 Settings 类有一个名为Default 的静态属性,它表示应用程序的当前设置。因此,在主窗体的 Closing 事件中,您调用:

        Properties.Settings.Default.Save();
        

        ...保存设置。

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

        【讨论】:

        • 谢谢!这让我朝着正确的方向前进。在 vb.net 中,它是 My.Settings 而不是 Properties.Settings.Default,但除此之外,它工作得很好。我现在只有一个设置,并且在 Load 和 FormClosing 事件中使用表单的公共属性。
        • 在我的电脑上没有必要在关闭时保存设置。它们会自动保存。唯一的问题是我必须点击两次。
        【解决方案4】:

        此行为在此处的第 5 项中进行了解释:

        http://turbulentintellect.blogspot.com/2008/07/surviving-winforms-databinding.html

        一种可能的解决方案是自定义 GroupGox: Best way to databind a group of radiobuttons in WinForms

        【讨论】:

        • 感谢您的回答。我什至忘了问这个问题!
        • 我的荣幸!感谢您的支持:)
        猜你喜欢
        • 2013-07-28
        • 1970-01-01
        • 1970-01-01
        • 2019-02-03
        • 1970-01-01
        • 2019-01-01
        • 2019-03-25
        • 2019-09-24
        • 2011-03-08
        相关资源
        最近更新 更多