在Windows表单中如何对单选按钮进行分组

3

我有一个表单,里面有多个单选按钮,每次只能选择一个。

有些单选按钮是相关联的,需要通过标题进行解释。为此,我将它们放在了一个Groupbox中。但是这样一来,Groupbox中的单选按钮与外部的单选按钮不再相互关联,可能会出现两个单选按钮都被选中的情况。

有没有办法将这些单选按钮连接起来,使它们彼此作用?或者,有没有比使用Groupbox更好的方式来分组和解释这些单选按钮?


可能是如何对Windows窗体单选按钮进行分组?的重复问题。 - Ruskin
4个回答

5

根据MSDN的设计,RadioButton会被分组放置在容器内。

当用户选择一个选项按钮(也称为单选按钮)时,其他按钮将自动清除。在给定容器(如窗体)中的所有RadioButton控件构成一组。要在一个表单上创建多个组,请将每个组放在其自己的容器中,例如GroupBox或Panel控件。

您可以尝试为您想要链接的RadioButtons使用通用事件处理程序,并自行处理Checking/UnChecking,或者将RadioButtons放置在GroupBox上方,不将它们添加到GroupBox中,然后BringToFront。


3
这是可行的,但代价很高。您需要将其AutoCheck属性设置为false,并自己取消勾选其他按钮。最令人尴尬的事情是选项卡停止工作不正确,分组的一组按钮只有一个选项卡停止,但如果将AutoCheck = false,则每个按钮都可以通过选项卡进行选择。
毫无疑问,最大的问题是您会给用户带来相当大的困惑。因此,您可能应该考虑使用复选框。

2
在Windows Forms中,我认为没有一种简单的方法(例如设置GroupName属性)来对单选按钮进行分组。最快的方法是将单选按钮分组在一个集合中,并监听CheckedChanged事件。例如:
        var rbuttons = new List<RadioButton>{ radioButton1, radioButton2, radioButton3, radioButton4 }; //or get them dynamically..
        rbuttons.ForEach(r => r.CheckedChanged += (o, e) =>
        {
            if (r.Checked) rbuttons.ForEach(rb => rb.Checked = rb == r);
        });

如果列表中的任何一个单选按钮被选中,其他的自动变为未选中状态。

0
我通过处理CheckChanged事件解决了这个问题。
private void radio1_CheckedChanged(object sender, EventArgs e)
{
    if (radio1.Checked)
    {
        // do stuff
        radio2.Checked = false;
    }
}
private void radio2_CheckedChanged(object sender, EventArgs e)
{
    if (radio2.Checked)
    {
        // do stuff
        radio1.Checked = false;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接