Переберите элементы управления, чтобы найти errorProviders С# WinForm

Обзор функции.

У меня есть эта функция SaveDetails внутри 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();
}

person whatdoyouNeedFromMe    schedule 07.06.2017    source источник
comment
Никогда не имеет смысла использовать более одного ErrorProvider для формы. Одного достаточно, чтобы предоставить значки и всплывающие подсказки для всех элементов управления. Конечно, у вас никогда не возникнет проблем с поиском этого поставщика. Если вы хотите использовать ErrorProvider для также проверки всей формы, рассмотрите это.   -  person Hans Passant    schedule 07.06.2017


Ответы (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");
person Nino    schedule 07.06.2017