在循环中一起验证所有控件
本文关键字:控件 验证 一起 循环 | 更新日期: 2023-09-27 18:09:27
我使用以下方法来验证Winform的每个GroupBox
中TextBoxes
和ComboBoxes
中的用户输入。
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;
}
除了ComboBoxes
和TextBoxes
,我有RadioButtons
和1CheckBoxes1也要验证。
所以我在验证时也一直试图把它们考虑在内,但没有成功。
是否可以在同一方法/循环中检查RadioButtons
和Checkboxes
?
可以通过多种不同的方式执行验证。在您开始编写自己的验证方法之前,请考虑使用控件。验证/控制。已验证的事件处理程序和表单。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