0

功能概述。

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

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

title = cmb_Title.Text;

如果在迭代中发现了returns false一个errorProvider,它需要向用户显示一条错误消息,清除私有字段并让用户有机会重新输入详细信息,但不要清除文本框!

问题

循环遍历所有内容,所有控件,无论是否找到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();
}
4

1 回答 1

0

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");
于 2017-06-07T09:30:00.303 回答