【问题标题】:Radio Button Check Control With Tab Pages带有标签页的单选按钮检查控件
【发布时间】:2014-05-20 14:52:28
【问题描述】:

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

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

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

【问题讨论】:

  • 如果您将它们放在组框或其他容器中,则不必手动处理它们的 Checked 状态。
  • @etaiso - 看起来他只想在所有标签页中选择一个单选按钮
  • @Inkey - 第一个标签页上的单选按钮是否连接到 RadioButtonCheckedChanged 处理程序?
  • @etaiso 他们在分组框中。是的,这正是我需要实现的,是的,它们都链接到 RadioButtonCheckedChanged 处理程序
  • @Inkey 您的所有 RadioButtons CheckedChanged 事件是否都附有此代码?

标签: c# winforms


【解决方案1】:

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

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

            }
        }
    }
}

【讨论】:

    【解决方案2】:

    我认为(更好的调试和检查)您的问题是每次更改 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);
                    }
                }
            }
        }
    

    【讨论】:

    • 当我调试它碰到 rdoButtonName.Checked = true; 时不起作用然后它似乎取消选中它
    【解决方案3】:

    问题是,"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” 事件中使用此方法,它会起作用。我自己测试过。

    【讨论】:

      猜你喜欢
      • 2013-07-15
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多