检查组中的哪个单选按钮?

Bil*_*lly 116 .net c# radio-button winforms

使用WinForms; 有没有更好的方法来找到一个组的已检查RadioButton?在我看来,下面的代码不应该是必要的.当你检查一个不同的RadioButton然后它知道哪一个取消选中...所以它应该知道哪个被检查.如何在不执行大量if语句(或切换)的情况下提取该信息.

     RadioButton rb = null;

     if (m_RadioButton1.Checked == true)
     {
        rb = m_RadioButton1;
     }
     else if (m_RadioButton2.Checked == true)
     {
        rb = m_RadioButton2;
     }
     else if (m_RadioButton3.Checked == true)
     {
        rb = m_RadioButton3;
     }
Run Code Online (Sandbox Code Playgroud)

SLa*_*aks 214

您可以使用LINQ:

var checkedButton = container.Controls.OfType<RadioButton>()
                                      .FirstOrDefault(r => r.Checked);
Run Code Online (Sandbox Code Playgroud)

请注意,这要求所有单选按钮直接位于同一容器中(例如,Panel或Form),并且容器中只有一个组.如果不是这种情况,您可以List<RadioButton>在每个组的构造函数中创建s,然后编写list.FirstOrDefault(r => r.Checked).


Bob*_*bby 35

您可以将所有按钮的CheckedEvents连接到一个处理程序.在那里,您可以轻松获得正确的复选框.

// Wire all events into this.
private void AllCheckBoxes_CheckedChanged(Object sender, EventArgs e) {
    // Check of the raiser of the event is a checked Checkbox.
    // Of course we also need to to cast it first.
    if (((RadioButton)sender).Checked) {
        // This is the correct control.
        RadioButton rb = (RadioButton)sender;
    }
}
Run Code Online (Sandbox Code Playgroud)


Joã*_*elo 26

对于没有LINQ的人:

RadioButton GetCheckedRadio(Control container)
{
    foreach (var control in container.Controls)
    {
        RadioButton radio = control as RadioButton;

        if (radio != null && radio.Checked)
        {
            return radio;
        }
    }

    return null;
}
Run Code Online (Sandbox Code Playgroud)


D'H*_*Hag 11

OP希望获得经过检查的RadioButton BY GROUP.虽然@SLaks的答案非常好,但它并没有真正回答OP的主要问题.要改进@SLaks的答案,只需将LINQ更进一步.

这是我自己的工作代码的一个例子.按照普通的WPF,我的RadioButtons包含在一个网格(名为"myGrid")中,其中包含许多其他类型的控件.我在Grid中有两个不同的RadioButton组.

要从特定组中获取已检查的RadioButton:

List<RadioButton> radioButtons = myGrid.Children.OfType<RadioButton>().ToList();
RadioButton rbTarget = radioButtons
      .Where(r => r.GroupName == "GroupName" && r.IsChecked)
      .Single();
Run Code Online (Sandbox Code Playgroud)

如果您的代码可能没有选中RadioButtons,那么请使用"SingleOrDefault()".(如果我没有使用三态按钮,那么我总是将一个按钮"IsChecked"设置为默认选择.)


tan*_*ius 5

您可以对所有RadioButton 使用CheckedChanged事件.Sender将是未经检查和检查的RadioButtons.