【问题标题】:Iterate through Controls to find errorProviders c# WinFormc# WinForm遍历Controls找到errorProviders
【发布时间】:2017-06-07 09:08:51
【问题描述】:

功能概述。

我在WinForm 中有这个SaveDetails 函数,它遍历所有controls,以确定在用户输入期间是否在form 中标记了任何errorProviders。如果函数returns true, 我所有的TextBoxes 值都需要存储在我的私有字段中,并显示一个消息框并关闭表单。

//对于大约15个文本框,这是否也可以通过循环来实现?因为这看起来很麻烦。

title = cmb_Title.Text;

如果在迭代中找到returns falseerrorProvider,它需要向用户显示错误消息,清除私有字段并让用户有机会重新输入详细信息,但不要清除文本框!

问题

循环遍历所有控件,无论是否找到errorProvider。当只找到一个时,我怎样才能阻止它只标记?这个函数也在clickEvent中。

代码

isValid = true;
foreach (Control c in panel1.Controls)
{
    if (errorProvider1.GetError(c).Length > 0)
    {
        isValid = false;
        MessageBox.Show("invalid entry, please revisit the form before proceding");
    }
}
if (isValid)
{
    title = cmb_Title.Text;
    surName = txt_SurName.Text;
    dateOfBirth = dateTimePicker1.Text.ToString();

    MessageBox.Show("Indi Form Saved");
    Hide();
}

【问题讨论】:

  • 为一个表单使用多个 ErrorProvider 是没有任何意义的。一个就足以为所有控件提供图标和工具提示。当然,您将永远不会遇到任何麻烦找到那个供应商。如果您想使用 ErrorProvider 验证整个表单,那么 consider this.

标签: c# .net winforms errorprovider


【解决方案1】:

您可以仅使用 TextBox 控件和 Linq 来缩短它。

类似这样的:

List<TextBox> textBoxes = panel1.Controls.OfType<TextBox>().ToList();
if (textBoxes.Any(tb => !string.IsNullOrEmpty(errorProvider1.GetError(tb))))
    MessageBox.Show("invalid entry, please revisit the form before proceding");

如果您不想只检查TextBox 控件而是检查panel1 中的所有控件,您仍然可以使用Linq 来简化您的代码。

var controlsList = panel1.Controls.Cast<Control>().ToList();
if (controlsList.Any(tb => !string.IsNullOrEmpty(errorProvider1.GetError(tb))))
    MessageBox.Show("invalid entry, please revisit the form before proceding");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多