带标签页的单选按钮检查控制

时间:2014-05-19 10:59:57

标签: c# winforms

我有许多不同的标签,在标签中我有一些单选按钮。我只想在标签页中一次选择一个单选按钮。我有以下代码

  private void RadioButtonCheckedChanged(object sender, EventArgs e)
    {
        TabControl.TabPageCollection pages = tabControl1.TabPages;
        var rdoButtonName = sender as RadioButton;
        foreach (TabPage page in pages)
        {
            foreach (Control item in page.Controls)
            {
                if (item is RadioButton)
                {
                    if (rdoButtonName.Name == item.Name)
                    {
                        rdoButtonName.Checked = true;
                    }
                    else
                    {
                        rdoButtonName.Checked = false;
                    }
                }
            }
        }
    }

当我点击第一个标签页上的单选按钮时,它不允许我更改其检查状态,但它会在其他页面上更改。任何人都可以看到上述代码有什么问题吗?

3 个答案:

答案 0 :(得分:0)

我看到您将Checked值设置为发件人,而不是其他单选按钮......

private void RadioButtonCheckedChanged(object sender, EventArgs e)
{
    TabControl.TabPageCollection pages = tabControl1.TabPages;
    var rdoButtonName = sender as RadioButton;
    foreach (TabPage page in pages)
    {
        foreach (Control item in page.Controls)
        {
            if (item is RadioButton)
            {
                if (item.Name != rdoButtonName.Name)
                {
                    item.Checked = false;
                }

            }
        }
    }
}

答案 1 :(得分:0)

我认为(更好的调试和检查)你的问题是每次你改变一个RadioButton状态时它会再次调用这个函数并产生意想不到的结果。

要解决此问题,我会在更改Checked状态之前分离并重新连接事件处理程序,如下所示:

 private void RadioButtonCheckedChanged(object sender, EventArgs e)
    {
        TabControl.TabPageCollection pages = tabControl1.TabPages;
        var rdoButtonName = sender as RadioButton;
        foreach (TabPage page in pages)
        {
            foreach (Control item in page.Controls)
            {
                if (item is RadioButton)
                { 
                    rdoButtonName.CheckedChanged -= new System.EventHandler(this.RadioButtonCheckedChanged);

                    if (rdoButtonName.Name == item.Name)
                    {
                        rdoButtonName.Checked = true;
                    }
                    else
                    {
                        rdoButtonName.Checked = false;
                    }

                    rdoButtonName.CheckedChanged += new System.EventHandler(this.RadioButtonCheckedChanged);
                }
            }
        }
    }

答案 2 :(得分:0)

问题是,“CheckedChanged” -event不能在这种情况下使用,这就是问题所在。关键是要使用另一个事件 - “点击”

    private void radioButton_Click(object sender, EventArgs e)
    {
        foreach (TabPage page in tabControl1.TabPages)
        {
            foreach (RadioButton radioButton in page.Controls)
            {
                if (radioButton != (RadioButton)sender) { radioButton.Checked = false; }
            }
        }
    }

更改您的RadioButtons以在“Click” -event中使用此方法,它将起作用。我亲自测试过。