【发布时间】:2012-06-12 06:24:31
【问题描述】:
我有一个带有多个单选按钮的表单,一次只能选择一个。
一些单选按钮是连接的,需要通过标题进行解释。为此,我将它们放在 Groupbox 中。但是,组框内的单选按钮不再连接到外面的单选按钮,并且可以从中选择两个。
有没有办法连接单选按钮,以便它们相互反应?或者有没有更好的方法来分组和解释单选按钮然后使用组合框?
【问题讨论】:
标签: c# radio-button windows-forms-designer
我有一个带有多个单选按钮的表单,一次只能选择一个。
一些单选按钮是连接的,需要通过标题进行解释。为此,我将它们放在 Groupbox 中。但是,组框内的单选按钮不再连接到外面的单选按钮,并且可以从中选择两个。
有没有办法连接单选按钮,以便它们相互反应?或者有没有更好的方法来分组和解释单选按钮然后使用组合框?
【问题讨论】:
标签: c# radio-button windows-forms-designer
根据 MSDN,RadioButton 的设计行为将按其容器分组:
当用户选择一个选项按钮(也称为单选按钮)时 在一个组内,其他人自动清除。所有单选按钮 给定容器(例如窗体)中的控件构成一个组。到 在一个表单上创建多个组,将每个组放在自己的位置 容器,例如 GroupBox 或 Panel 控件
您可以尝试对要链接的 RadioButtons 使用通用事件处理程序并自己处理 Checking/UnChecking,或者您可以将 RadioButtons 放在 GroupBox 顶部,而不是将它们添加到 GroupBox 然后 BringToFront。
【讨论】:
这是可能的,但代价高昂。您必须将其 AutoCheck 属性设置为 false 并自行取消选中其他按钮。最尴尬的事情是制表位,一组分组的按钮只有一个制表位,但如果您设置 AutoCheck = false 则每个按钮都可以制表位。
毫无疑问,最大的问题是您会给用户带来相当大的困惑。如此之多,以至于您可能应该考虑使用复选框。
【讨论】:
在 Windows 窗体中,我认为没有简单的方法(如设置 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);
});
如果列表中的任何单选按钮被选中,其他的将自动取消选中
【讨论】:
我通过处理 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;
}
}
【讨论】: