C# net使复选框充当单选按钮

C# net使复选框充当单选按钮,c#,.net,winforms,visual-studio-2010,C#,.net,Winforms,Visual Studio 2010,我有一个分组框,里面有一些单选按钮。我正试图在代码项目的教程的帮助下实现序列化。该教程支持复选框而不是单选按钮的序列化。所以我需要在我的应用程序中使单选按钮成为复选框,也就是说,它们应该是复选框,但工作起来像单选按钮 我试着编写代码,但当我发现某个特定的复选框被选中,然后我去取消选中,或者反之亦然,它会触发checked_更改的事件处理程序,这会进入一个无限循环 有人能帮我解决这个问题吗 谢谢 更新: 看到你的回复后,我想说声谢谢。是的,你是对的,我们不应该弄乱基本属性。我将修改序列化方法 另外

我有一个分组框,里面有一些单选按钮。我正试图在代码项目的教程的帮助下实现序列化。该教程支持复选框而不是单选按钮的序列化。所以我需要在我的应用程序中使单选按钮成为复选框,也就是说,它们应该是复选框,但工作起来像单选按钮

我试着编写代码,但当我发现某个特定的复选框被选中,然后我去取消选中,或者反之亦然,它会触发checked_更改的事件处理程序,这会进入一个无限循环

有人能帮我解决这个问题吗

谢谢

更新:

看到你的回复后,我想说声谢谢。是的,你是对的,我们不应该弄乱基本属性。我将修改序列化方法

另外,教程的链接是

最后更新:


在这里发布了回复之后,我决定不更改默认属性,而是更改序列化程序代码。我做到了,现在它工作得很好。非常感谢大家。

我同意所有的评论:不要让复选框像单选按钮一样,它违背了用户界面惯例,让用户感到困惑

正确的方法是修复代码以序列化单选按钮,但是如果看不到代码,就很难知道如何帮助您。首先,可以通过在执行任何操作之前临时删除事件处理程序来修复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类来处理单选按钮;只需复制处理复选框的代码,但更改对RadioButton的所有引用。你的问题不清楚这一步是否有必要。

我同意所有的评论:不要让复选框像单选按钮一样,它违背了用户界面惯例,让用户感到困惑

正确的方法是修复代码以序列化单选按钮,但是如果看不到代码,就很难知道如何帮助您。首先,可以通过在执行任何操作之前临时删除事件处理程序来修复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类来处理单选按钮;只需复制处理复选框的代码,但更改对RadioButton的所有引用。你的问题不清楚这一步是否有必要。

正如评论所说,你最好用单选按钮来实现序列化,而不是乱搞复选框。话虽如此,为了获得所需的效果,只需设置一个变量,指示您已经在处理更改事件,并对其进行测试。类似这样的代码很糟糕,但它展示了以下想法:

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

正如评论所说,你最好用单选按钮来实现序列化,而不是乱搞复选框。话虽如此,为了获得所需的效果,只需设置一个变量,指示您已经在处理更改事件,并对其进行测试。类似这样的代码很糟糕,但它展示了以下想法:

    private bool autoChange = false;
    private void ChangeHandler() {
        if (!autoChange) {
            autoChange = true;
            /* Do stuff */
            autoChange = false;
        }
    }
在执行此操作之前,使用-=从Checkedevent注销。完成后重新注册

我不反对这些评论。回答问题。

在执行此操作之前,使用-=从Checkedevent注销。完成后重新注册

我不反对这些评论。回答问题。

您好,这里有一个将复选框转换为单选按钮的简单答案:

并将此单击事件添加到每个复选框中 完成

您好,这里有一个将复选框转换为单选按钮的简单答案:

并将此单击事件添加到每个复选框中 完成

获取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);
            }
        }
    }
以CheckedListBox和call 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);
            }
        }
    }
阿克
... 不要这样做。控制标准化是有原因的——如果用户看到他们期望只有1个的无线电波,则只能选择1个。如果他们看到复选框,他们希望能够多选。1发布一些代码。2.找一个到教程的链接怎么样。让复选框像单选按钮一样工作听起来不是个好主意。我认为更好的办法是改变序列化以支持单选按钮。为什么不简单地以与复选框序列化相同的方式实现单选按钮的序列化呢?不应该有太大的区别。我同意@Jamiec。如果本教程没有单选按钮,请查找其他教程,或者我们可以尝试帮助您正确实施。无论哪种方式,都要修复实现。不要试图更改底层控件。这就是为什么我们有单选按钮。复选框将此事件分类,并以某种方式禁用此事件,然后执行您所说的所有操作,就像使单选按钮的用户控件看起来是方形而不是圆形。我只会使用单选按钮,而不是编写一个新控件。确认。。。不要这样做。控制标准化是有原因的——如果用户看到他们期望只有1个的无线电波,则只能选择1个。如果他们看到复选框,他们希望能够多选。1发布一些代码。2.找一个到教程的链接怎么样。让复选框像单选按钮一样工作听起来不是个好主意。我认为更好的办法是改变序列化以支持单选按钮。为什么不简单地以与复选框序列化相同的方式实现单选按钮的序列化呢?不应该有太大的区别。我同意@Jamiec。如果本教程没有单选按钮,请查找其他教程,或者我们可以尝试帮助您正确实施。无论哪种方式,都要修复实现。不要试图更改底层控件。这就是为什么我们有单选按钮。复选框将此事件分类,并以某种方式禁用此事件,然后执行您所说的所有操作,就像使单选按钮的用户控件看起来是方形而不是圆形。我只想用单选按钮,而不是写一个新的控件。我明白你们想说什么。本教程不处理单选按钮。我会改变它来处理他们。非常感谢你的帮助。非常感谢你的帖子。我没有使用register/unregister checked事件。我所做的只是编辑serializer类来处理单选按钮。再次感谢。我明白你想说什么。本教程不处理单选按钮。我会改变它来处理他们。非常感谢你的帮助。非常感谢你的帖子。我没有使用register/unregister checked事件。我所做的只是编辑serializer类来处理单选按钮。再次感谢。