【问题标题】:C# .net Make checkboxes to behave as a radio buttonC# .net 使复选框充当单选按钮
【发布时间】:2012-01-10 14:54:31
【问题描述】:

我有一个包含一些单选按钮的组框。我正在尝试在 Code Project 的教程的帮助下实现序列化。该教程支持复选框而不是单选按钮的序列化。所以我需要将我的应用程序中的单选按钮设置为复选框(也就是说,它们应该是复选框,但像单选按钮一样工作)。

我尝试编写代码,但是当我发现一个特定的复选框被选中并且我去取消选中或者反之亦然时,它会触发 check_changed 事件处理程序,这会进入无限循环。

有人可以帮我解决这个问题吗?

谢谢

更新:

看到您的回复后,非常感谢您。是的,你没关系,我们不应该弄乱基本属性。我将努力改变序列化方法。

P.S 教程的链接是http://www.codeproject.com/KB/dialog/SavingTheStateOfAForm.aspx

最终更新:

按照此处发布的回复后,我决定不更改默认属性,而是更改序列化程序代码。我做到了,现在它完美地工作了。非常感谢大家。

【问题讨论】:

  • 确认...不要这样做。控件被标准化是有原因的——如果用户看到单选按钮,他们希望只能选择 1 个。如果他们看到他们希望能够多选的复选框。
  • 1) 发布一些代码。 2)如何链接到教程。 3) 让 CheckBoxes 像 RadioButtons 一样执行听起来是个坏主意。我认为一个更好的主意是更改序列化以支持 RadioButtons。
  • 为什么不简单地实现单选按钮的序列化,就像复选框的序列化一样?应该不会有太大区别。
  • 我同意@Jamiec。如果教程没有单选按钮,请查找其他教程,或者我们可以尝试帮助您正确实现它。无论哪种方式,修复实现。不要尝试更改底层控件。
  • 这就是我们有单选按钮的原因。复选框类这个事件并以某种方式禁用它并做你所说的一切就像制作一个单选按钮的用户控件(看起来是方形而不是圆形)。我只会使用单选按钮而不是编写新控件。

标签: c# .net winforms visual-studio-2010


【解决方案1】:

我同意所有评论者的观点:不要制作类似于单选按钮的复选框,它会违背 UI 惯例并让用户感到困惑。

执行此操作的正确方法是修复您的代码以序列化单选按钮,但如果没有看到您的代码,很难知道如何为您提供帮助。首先,您可以通过在执行任何操作之前临时删除事件处理程序来修复CheckedChanged 循环。例如:

myCheckBox.CheckedChanged -= MyCheckedChangedEventHandler;
myCheckBox.Checked = true;
myCheckBox.CheckedChanged += MyCheckedChangedEventHandler;

如果仅此一项不能解决您的问题,请向我们展示您的代码,我们会尽力提供更多帮助。

编辑:根据您更新中列出的教程,我猜当您调用FormSerialisor.Deserialise() 时会发生问题,这会触发您的控件的事件处理程序触发?如果是这种情况,快速解决方法就是按照我提到的做:在调用 FormSerialisor.Deserialise() 之前删除单选按钮事件处理程序,然后再重新添加它们。示例:

myRadioButton.CheckedChanged -= MyCheckedChangedEventHandler;
FormSerialisor.Deserialise(this, mySerialisepath);
myRadioButton.CheckedChanged += MyCheckedChangedEventHandler;

您可能还需要编辑 FormSerialisor 类来处理 RadioButtons;只需复制处理复选框的代码,但更改对 RadioButton 的所有引用。从您的问题中不清楚这一步是否必要。

【讨论】:

  • 我明白你想说什么。本教程不处理单选按钮。我也会改变它来处理它们。非常感谢您的帮助。
  • 非常感谢您的帖子。我没有使用注册/注销检查事件。我所做的只是编辑序列化程序类来处理单选按钮。再次感谢。
【解决方案2】:

就像 cmets 说的那样,最好让序列化与单选按钮一起使用,而不是使用复选框。话虽如此,要获得所需的效果,只需设置一个变量,表明您已经在处理更改事件,并对其进行测试。像这样的东西(这是糟糕的代码,但演示了这个想法):

    private bool autoChange = false;
    private void ChangeHandler() {
        if (!autoChange) {
            autoChange = true;
            /* Do stuff */
            autoChange = false;
        }
    }

【讨论】:

    【解决方案3】:

    在此之前从Checkedevent 取消注册(通过使用-=)。完成后重新注册。

    (我不是在和cmets争论。只是回答问题。)

    【讨论】:

      【解决方案4】:

      您好,这里有一个简单的答案,可以将 CheckBox 转换为 RadioButton:

      object clickBox = null;
      
       private void checkBox_Click(object sender, EventArgs e)
          {
              clickBox = sender;
      
              foreach (Control c in this.Controls)
              {
                  if (c is CheckBox)
                  {
                      if (c != clickBox)
                      {
                          ((CheckBox)c).Checked = false;
                      }
                  }
              }
      

      并在每个复选框中添加此 Click 事件 完成

      【讨论】:

        【解决方案5】:

        获取 CheckedListBox 并调用 ItemCheck 事件并使用以下代码它的行为类似于单选按钮(它适用于我):-

         private void chkListBox_ItemCheck(object sender, ItemCheckEventArgs e)
            {
                if (e.NewValue == CheckState.Checked)
                {
                    for (int item = 0; item < chkListBox.Items.Count; item++)
                    {
                        chkListBox.SetItemChecked(item, false);
                    }
                }
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-10-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多