我有一个带有许多单选按钮的表单,一次只能选择一个。
一些单选按钮已连接,需要通过标题进行解释。为此,我将它们放在 Groupbox 中。但是,组框内的单选按钮不再连接到外面的单选按钮,并且可以从中选择两个。
有没有办法连接单选按钮,以便它们相互反应?或者有没有更好的方法来分组和解释单选按钮然后使用组框?
我有一个带有许多单选按钮的表单,一次只能选择一个。
一些单选按钮已连接,需要通过标题进行解释。为此,我将它们放在 Groupbox 中。但是,组框内的单选按钮不再连接到外面的单选按钮,并且可以从中选择两个。
有没有办法连接单选按钮,以便它们相互反应?或者有没有更好的方法来分组和解释单选按钮然后使用组框?
根据 MSDN,这是按其容器分组的RadioButton的设计行为:
当用户在组中选择一个选项按钮(也称为单选按钮)时,其他选项按钮会自动清除。给定容器(如 Form)中的所有 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;
}
}