如何在TabControl的选项卡页面上对单选按钮进行分组

时间:2014-06-10 13:24:55

标签: c# winforms

我遇到容器工具箱中的TabControl问题。

我可以将标签设置为页面,布局很好,一切都运行良好,直到我在每个页面上放置4个RadioButtons。 如果我单击一个RadioButton,它会被检查,如果我点击另一个被检查并且第一个被清除,那么这么好。 当我更改到不同的标签页并单击RadioButton时,问题就开始了,它会被检查,但上一页的RadioButton也会被检查。

有没有办法将所有页面上的所有RadioButton组合在一起,这样一次只能检查一个RadioButton?

3 个答案:

答案 0 :(得分:1)

我和Hans Passant在一起。首先,这听起来像是一个你应该重新考虑的设计,让任何控件都与隐藏的控件交互,这些控件不会与其它与之交互的控件显示出来?我提醒你重新考虑你的设计。

有了这个免责声明,当人们不回答我的问题时,我仍然很生气,他们所做的就是批评我的问题并且真的问我为什么这样做,或者你不应该& #39; t那样做。我的尝试是给你积极的批评,重新思考你的设计。 但是我仍然可以为您提出最佳答案...

所以我只需将它编码到每个单选按钮上的已检查事件中。它有点古怪,但我认为你的设计和你想要做的事情(非常)也很奇怪。

因此,在每个已检查事件中,您需要首先:测试当前(新)检查的值是否为true而不是false,因为检查到的事件会在两种情况发生时触发:当单选按钮被选中时和< / em>当它变得未经检查时。如果你不寻找这个或者知道要找这个,这有点奇怪。

第二,如果选中,那么我会调用一个单独的&#39; UncheckRadioButtons&#39;带有参数的方法,该参数传递刚刚检查过的单选按钮。在那个UncheckRadioButtons方法中,我有一个你编码的数组或单选按钮列表,其中包含你只需要一次检查其中一个的所有单选按钮,然后为每个循环迭代以查看每个项目你的RadioButton列表或数组。在循环中,您可以简单地测试该单选按钮是否与传递给UncheckRadioButtons方法的单选按钮相同,如果它不是相同的单选按钮并且已选中,则取消选中该单选按钮。所以你的UncheckRadioButtons方法将取消选中除了作为参数传递给它的一个RadioButton之外的所有RadioButton。

抱歉,我没有时间为您编写这样的方法,以便更好地改善我的答案。但我想给你一个真正的答案,至少在你的路上帮助你。 :)

答案 1 :(得分:0)

感谢您的投入。我有7个标签控制页面,代表一周7天。 每页有4个DGV。 从中央列表DB中选择项目并将其放入DGV中以获得所需的日期。 通过检查radioButton或单击选择radioButton的DGV来选择所需的DGV。放置项目的位置仅依赖于一个被检查的radioButton。 因为只有28个radioButtons,我将给每个一个checkChanged事件,如下所示。

    public int selectedDay{ get; set;}

    public void clearOtherDays(int day)
    {
        if ( day != 1)
        { rbB1.Checked = false; rbL1.Checked = false; rbD1.Checked = false; rbS1.Checked = false;}
        if (day != 2)
        { rbB2.Checked = false; rbL2.Checked = false; rbD2.Checked = false; rbS2.Checked = false;}
        if (day != 3)
        { rbB3.Checked = false; rbL3.Checked = false; rbD3.Checked = false; rbS3.Checked = false;}
        if (day != 4)
        { rbB4.Checked = false; rbL4.Checked = false; rbD4.Checked = false; rbS4.Checked = false;}
        if (day != 5)
        { rbB5.Checked = false; rbL5.Checked = false; rbD5.Checked = false; rbS5.Checked = false;}
        if (day != 6)
        { rbB6.Checked = false; rbL6.Checked = false; rbD6.Checked = false; rbS6.Checked = false;}
        if (day != 7)
        { rbB7.Checked = false; rbL7.Checked = false; rbD7.Checked = false; rbS7.Checked = false;}
    }

    private void rbL1_CheckedChanged(object sender, EventArgs e)
    {
        if (rbL1.Checked) {clearOtherDays(1); selectedDay = 1; }
    }

这似乎可以胜任这项工作,但如果有更好的解决方案,我愿意接受各种想法,学习是好的。

非常感谢。

答案 2 :(得分:0)

旧线程,但我会把我的两分钱解决方案放在这里。

导出您的解决方案我刚刚检查了所有选项卡页面上的所有单选按钮,而选项卡控件在检查时不在活动标签页上。

/// <summary> Unchecks all the radio buttons on each tab page except the active one </summary>
/// <param name="activePage"> The active tab page when the radio button was clicked</param>
private void UncheckLayouts(TabPage activePage)
{
    foreach (TabPage tabPage in tabLayouts.TabPages)
    {
        if (tabPage == activePage) continue;
        foreach (RadioButton rb in tabPage.Controls)
        {
            rb.Checked = false;
        }
    }
}

然后每个CheckedChanged事件:

UncheckLayouts(tabControl.SelectedTab);