循环浏览动态窗体和面板,并检查单选按钮是否选中

本文关键字:单选按钮 检查 是否 浏览 动态 窗体 和面板 循环 | 更新日期: 2023-09-27 18:28:44

我有一个动态创建的表单,这个表单上有几个在运行时创建的单选按钮。这个表单上有一个按钮,例如"下一步",当用户点击下一个我想循环通过并检查在我继续之前是否检查了其中一个单选按钮时,我尝试了以下操作:

    void nextButton_Click(object sender, EventArgs e)
    {
        foreach (Control c in _form.Controls)
        {
            if (c is RadioButton)
            {
                RadioButton radio = c as RadioButton;
                if (radio is RadioButton)
                {
                    if (radio.Checked == true)
                    {
                        //code continue to next 
                    }
                    else
                    {
                        MessageBox.Show("You must select at least one.");
                    }
                }
            }
        } 
    }

亲切问候地理

循环浏览动态窗体和面板,并检查单选按钮是否选中

您可以使用Linq使更简单

bool checked = _form.Controls.OfType<RadioButton>().Any(rb => rb.Checked);

--编辑--

我更新了答案以递归搜索所有控件。

bool IsChecked(Control parent)
{
    if (parent.Controls.OfType<RadioButton>().Any(rb => rb.Checked)) return true;
    foreach (Control c in parent.Controls)
        if (IsChecked(c)) return true;
    return false;
}
bool checked = IsChecked(_form);

如果检查了其中一个单选项,则应退出循环,因此如果找到退出条件,则添加一个退出条件。

 if (radio.Checked == true)
 {
      return;
 }
 else
 {
      MessageBox.Show("You must select at least one.");
 }

要查找嵌套控件,您应该使用:

 _form.Controls.Find()

可能您的单选按钮位于面板内。因此单选按钮被列在面板的控件集合中,而不是表单中

    private static void CheckRadioButton(Control control)
    {
        foreach (Control c in control.Controls)
        {
            if (c is RadioButton)
            {
                if (((RadioButton)c).Checked == true)
                {
                    //code continue to next 
                }
                else
                {
                    MessageBox.Show("You must select at least one.");
                    return; //should be
                }
            }
            else if (c.Controls.Count > 0)
                CheckRadioButton(c);
        }
    }

现在通过传递form作为参数来调用此方法。像这样或那样:

void nextButton_Click(object sender, EventArgs e)
{
    CheckRadioButton(this); //or whichever form it is..
}

您不需要再次进行不必要的内部循环,以确认控件是否为单选按钮。