C#.net使复选框表现为单选按钮

时间:2012-01-10 14:54:32

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

我有一个组合框,里面有一些单选按钮。我试图在Code Project的教程的帮助下实现序列化。该教程支持复选框的序列化,而不支持单选按钮。所以我需要在我的应用程序中将单选按钮设置为复选框(即它们应该是复选框,但工作方式类似于radiobutton)。

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

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

由于

更新:

看到你的回复后,我想多多感谢。是的,你没关系我们不应该搞乱基本属性。我将使用更改序列化方法。

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

最终更新:

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

5 个答案:

答案 0 :(得分:5)

我同意所有评论者的观点:不要使复选框像单选按钮那样,它会面对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的所有引用。从您的问题不清楚这一步是否有必要。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

在执行此操作之前,从Checked事件取消注册(使用-=)。完成后重新注册。

(我不是在评论。只是回答这个问题。)

答案 3 :(得分:1)

您好,这里是将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事件 完成

答案 4 :(得分:0)

使用 CheckedListBox 并调用 ItemCheck 事件并使用下面的代码,它的行为类似于单选按钮(对我有用):-< / p>

 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);
            }
        }
    }