C# 带有选项卡页的单选按钮检查控件

C# 带有选项卡页的单选按钮检查控件,c#,winforms,C#,Winforms,我有许多不同的选项卡,在这些选项卡中我有一些单选按钮。我只希望在选项卡页面中一次选择一个单选按钮。我有以下代码 private void RadioButtonCheckedChanged(object sender, EventArgs e) { TabControl.TabPageCollection pages = tabControl1.TabPages; var rdoButtonName = sender as RadioButton;

我有许多不同的选项卡,在这些选项卡中我有一些单选按钮。我只希望在选项卡页面中一次选择一个单选按钮。我有以下代码

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

当我点击第一个选项卡页面上的单选按钮时,它不允许我更改其选中状态,但在其他页面上允许。有人看到上面的代码有什么问题吗?

我看到您将Cheked值设置为sender,而不是其他单选按钮

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

            }
        }
    }
}
我认为(更好的调试和检查)您的问题是,每次更改一个RadioButton状态时,它都会再次调用此函数,并产生意外的结果

要修复此问题,我将在更改
选中状态之前分离并重新连接事件处理程序,如下所示:

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

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

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

“单击”-事件中更改单选按钮以使用此方法,它将正常工作。我自己测试过。

如果你把它们放在groupbox或其他容器中,你不必手动处理它们的选中状态。@etaiso-看起来他只需要在所有选项卡中选择一个单选按钮pages@Inkey-第一个选项卡页面上的单选按钮是否连接到RadioButtonCheckedChanged处理程序?@etaiso它们位于组框中。是的,这正是我需要实现的是的,它们都链接到RadioButtonchedChangedhandler@Inkey是否所有单选按钮都已检查此代码附带的已更改事件?当我调试时,它点击rdoButtonName时不起作用。Checked=true;然后它似乎会取消选中它