使用C#中的不同父控件对Windows窗体Radiobuttons进行分组

我有一个Windows窗体应用程序,其中我有许多RadioButtons。 这些RadioButton放置在FlowLayoutPanel中 ,它自动为我安排它们。 直接添加到FlowLayoutPanel的所有RadioButton都被分组,这意味着我只能选择其中一个。 然而,其中一些RadioButtons与TextBox配对,所以我可以在那里提供一些参数。 但为了正确安排所有这些,我将一个Panel控件添加到FlowLayoutPanel,这样我就可以自己控制RadioButton和TextBox相对于彼此的对齐方式。

这些RadioButton现在有各自的Panel作为父控件,因此不再包含在与其他RadioButtons的无线电组中。 我读到System.Web.UI命名空间中的RadioButtons具有GroupName属性,但不幸的是他们的System.Windows.Forms对应物缺少此属性。 有没有其他方法我可以组合这些单选按钮是我将不得不自己处理onClick事件?

谢谢,杰里

我担心你必须手动处理它……实际上并没有那么糟糕,你可以将所有RadioButton存储在一个列表中,并为所有这些使用单个事件处理程序:

private List _radioButtonGroup = new List(); private void radioButton_CheckedChanged(object sender, EventArgs e) { RadioButton rb = (RadioButton)sender; if (rb.Checked) { foreach(RadioButton other in _radioButtonGroup) { if (other == rb) { continue; } other.Checked = false; } } } 

我同意@JonH – 使用标签是最干净的方法(imho)

  private void FormLoad(object sender, EventArgs e) { radioCsv.Tag = DataTargetTypes.CsvFile; radioTabbed.Tag = DataTargetTypes.TxtFile; radioSas.Tag = DataTargetTypes.SasFile; } private void RadioButtonCheckedChanged(object sender, EventArgs e) { var radio = (RadioButton) sender; this.DataDestinationType = (DataTargetTypes)radio.Tag; } 

这是对第一个答案的一点改进:创建一个封装分组function的RadioGroup类,并添加对标准键盘导航(向上/向下键)的支持,并使标签工作。

要使用它,只需在表单中声明一个RadioGroup成员并将其新建(在InitializeComponent()之后),按正确的顺序传递组中所需的所有单选按钮。

 public class RadioGroup { List _radioButtons; public RadioGroup(params RadioButton[] radioButtons) { _radioButtons = new List(radioButtons); foreach (RadioButton radioButton in _radioButtons) { radioButton.TabStop = false; radioButton.KeyUp += new KeyEventHandler(radioButton_KeyUp); radioButton.CheckedChanged += new EventHandler(radioButton_CheckedChanged); } _radioButtons[0].TabStop = true; } void radioButton_KeyUp(object sender, KeyEventArgs e) { e.Handled = true; RadioButton radioButton = (RadioButton)sender; int index = _radioButtons.IndexOf(radioButton); if (e.KeyCode == Keys.Down) { index++; if (index >= _radioButtons.Count) { index = 0; } e.Handled = true; } else if (e.KeyCode == Keys.Up) { index--; if (index < 0) { index = _radioButtons.Count - 1; } e.Handled = true; } radioButton = _radioButtons[index]; radioButton.Focus(); radioButton.Select(); } void radioButton_CheckedChanged(object sender, EventArgs e) { RadioButton currentRadioButton = (RadioButton)sender; if (currentRadioButton.Checked) { foreach (RadioButton radioButton in _radioButtons) { if (!radioButton.Equals(currentRadioButton)) { radioButton.Checked = false; } } } } } 

需要注意的是:向上/向下键不能很好地与现有的RadioButton类一起工作,因为它已经处理了向上/向下键。 一种简单的方法可以将其修复为子类RadioButton并关闭向上/向下键的处理:

 public class RadioButtonEx : RadioButton { protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (keyData == Keys.Up || keyData == Keys.Down) { return true; } return base.ProcessCmdKey(ref msg, keyData); } } 

@Jerry,我对Windows Forms不太熟悉,但我会拍摄一下。 如果有一个名为Tag的属性,您可以使用唯一标记标记每个单选按钮。