2014-06-10 49 views
0

我对Containers工具箱中的TabControl有问题。如何在TabControl的标签页上对RadioButtons进行分组

我可以将标签设置为页面和布局都很好,所有工作都很好,直到我在每个页面上放置4个RadioButton。 如果我点击一个RadioButton,它会被检查,如果我点击另一个被选中,第一个被清除,那么这么好。 当我切换到不同的标签页并单击一个RadioButton时,问题就开始了,它会被检查,但前一页上的RadioButton也会被检查。

是否有任何方法将所有页面上的所有RadioButton分组在一起,以便在任何时候只检查一个RadioButton?

+0

此答案:http://stackoverflow.com/a/16239389/491907显示单选按钮(实际复选框)的子类的实例,其中一个' GroupName'属性(类似于WPF)被添加。我没有尝试过,但它可能是一个开始。 – pinkfloydx33

+2

与您之前的问题相同。您不能在多个容器中使用AutoCheck属性。所以你必须将它设置为False,并编写代码将Checked属性显式设置为false。如果你感觉到你在与机器对抗,那么你是对的,这不是一个好的用户界面。 –

回答

0

感谢您的意见。我有7个选项卡控制页面,代表每周7天。 每页有4个DGV。从中央列表DB中选择 项目,并将其放置到所需日期的DGV中。 要求的DGV可以通过选中radioButton或点击选择radioButton的DGV来选择。项目放置的位置取决于只检查一个radioButton。 由于只有28个radioButton,我会给每个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; } 
    } 

这似乎做的工作,但如果有一个更好的解决办法我打开思路,学习好。

很多谢谢。

1

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

带着这个免责声明,当人们不回答我的问题时,我仍然很生气,他们所做的只是批评我的问题,真的问我'为什么要那样做',或者你不应该这样做。我的尝试是给你积极的批评,重新考虑你的设计。 但是我仍然会给你我的问题的最佳答案...

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

所以每个选中的事件中,你需要首先:测试,目前的(新)检查值是真实的,不是虚假的,因为检查事件触发这两个事情发生的时候:当无线电按钮变为检查时它变得没有检查。这有点奇怪,如果你不寻找这个或知道寻找这个。

第二,如果它被选中,那么我会调用一个单独的'UncheckRadioButtons'方法,其中一个参数传递了刚刚检查过的单选按钮。在这个UncheckRadioButtons方法中,我会有一个数组或单选按钮列表,它包含您只希望其中一个选中的所有单选按钮,然后为每个循环遍历RadioButton中的每个项目列表或数组。在你的循环中,你可以简单地测试这个单选按钮是否与传递给你的UncheckRadioButtons方法的单选按钮相同,如果它不是相同的单选按钮并且它被选中,那么取消选中该单选按钮。因此您的UncheckRadioButtons方法将取消选中除传递给它的一个RadioButton作为参数的所有RadioButton。

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

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); 
相关问题