在循环中一起验证所有控件

本文关键字:控件 验证 一起 循环 | 更新日期: 2023-09-27 18:09:27

我使用以下方法来验证Winform的每个GroupBoxTextBoxesComboBoxes中的用户输入。

private bool ValidateControlsIn(GroupBox gb)
{
    foreach (Control c in gb.Controls.Cast<Control>().OrderBy(c => c.TabIndex))
    {
        if (c is TextBox || c is ComboBox)
        {
            if (string.IsNullOrWhiteSpace(c.Text))
            {
                MessageBox.Show(string.Format("Empty field {0 }", c.Name.Substring(3)));
                c.Focus();
                return false;
            }
        }
    }
    return true;
}

除了ComboBoxesTextBoxes,我有RadioButtons和1CheckBoxes1也要验证。

所以我在验证时也一直试图把它们考虑在内,但没有成功。

是否可以在同一方法/循环中检查RadioButtonsCheckboxes ?

在循环中一起验证所有控件

可以通过多种不同的方式执行验证。在您开始编写自己的验证方法之前,请考虑使用控件。验证/控制。已验证的事件处理程序和表单。ValidateChildren方法。这些规定为您的工作减少了大量工作量,并添加了取消事件参数,以停止离开/失去焦点过程。

如果你承诺使用你自己的foreach和迭代控件,你有一个好主意,虽然它不会看起来很好,当缩放它。

foreach (Control c in gb.Controls.Cast<Control>().OrderBy(c => c.TabIndex))
        {
            if (c is TextBox || c is ComboBox)
            {
                if (string.IsNullOrWhiteSpace(c.Text))
                {
                    MessageBox.Show(string.Format("Empty field {0 }", c.Name.Substring(3)));
                    c.Focus();
                    return false;
                }
            }
            else if (c is RadioButton)
            {
                //handle me
                return false;
            }
            else if (c is CheckBox)
            {
                //handle me
                return false;
            }
        }
        return true;

使用可用的validation/Validated条款,您可以为每个控件类型或每个单独的控件添加自定义处理程序。这允许您使方法定义更小、更模块化。请看下面的例子:

private void button1_Click(object sender, EventArgs e)
    {
        // fires validating events for all controls that are selectable.
        // other constraints are available.
        this.ValidateChildren(ValidationConstraints.Selectable);
    }

    /// <summary>
    /// Handles the validating for a single control or multiple controls.
    /// Depends on the registration.
    /// </summary>
    /// <param name="sender">The source of the event.</param>
    /// <param name="e">The <see cref="CancelEventArgs"/> instance containing the event data.</param>
    private void textBox1_Validating(object sender, CancelEventArgs e)
    {
        bool condition = true;
        if (!condition)
        {
            // remaining validation and leave stack will not be performed.
            e.Cancel = true;
        }
    }
    /// <summary>
    /// Handles post validation for a single control or multiple controls.
    /// Depends on the registration.
    /// </summary>
    /// <param name="sender">The source of the event.</param>
    /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
    private void textBox1_Validated(object sender, EventArgs e)
    {
        // handle after validation logic here.
        // spray happy faces all over the world.
    }

我希望这能给你的问题一个像样的答案,以及一个看起来更干净的替代方案。

使用else if检查其他:

if (c is TextBox || c is ComboBox)
{
      if (string.IsNullOrWhiteSpace(c.Text))
      {
            MessageBox.Show(string.Format("Empty field {0 }", c.Name.Substring(3)));
            c.Focus();
            return false;
      }
}
else if(c is RadioButton)
{
      // Logic
}
else if(c is CheckBox)
{
      // Logic
}

如果你想要真正的定位它们,将它们强制转换为它们的类型:

RadioButton rdb = c as RadioButton;
CheckBox cb = c as CheckBox;

的例子:

else if(c is RadioButton)
{
     RadioButton rd = c as RadioButton;
     if(rd != null)
     {
           if(!rd.Checked)
                // Do something
     }
}

回想起来,你实际上可以将C转换为一个RadioButton,因为你已经检查过它是否为一个:RadioButton rd = (RadioButton)c,然后跳过rd != null