Проверка данных в WinForm - PullRequest
       2

Проверка данных в WinForm

4 голосов
/ 18 августа 2011

Я создал диалоговое окно в своем приложении WinForms.Это имеет много текстовых полей и кнопки ОК / Отмена.Когда пользователь нажимает «ОК», я хочу, чтобы диалоговое окно закрывалось, только если все записи верны.Я могу видеть, как это сделать с «проверкой» событий для каждого элемента управления в отдельности.Это хорошо.Но они, похоже, срабатывают только тогда, когда контроль теряет фокус.Однако пустые текстовые поля в моем диалоговом окне также являются недопустимыми, что означает, что пользователь, возможно, никогда не фокусировался на этом элементе управления.Я предпочел бы просто проверить все элементы управления при нажатии OK.

Я не могу понять, как это сделать, хотя.Переопределение щелчка по кнопке OK, похоже, не позволяет остановить закрытие окна.Событие Form IsClosing происходит путем установки Cancel = true.Но это, кажется, не в состоянии различить, нажата ли кнопка OK или Отмена.Очевидно, что если нажата кнопка отмены, меня не волнует проверка и я хочу, чтобы форма закрывалась независимо.

Каков наилучший подход для этого?]

Обновление: я ужеБыло установлено, что CausesValidation имеет значение true как на моей форме, так и на кнопке ОК, но мое событие проверки не срабатывает, когда я нажимаю кнопку ОК.Я упоминаю об этом, как это было предложено в качестве решения ниже.

Ответы [ 3 ]

5 голосов
/ 18 августа 2011

Пожалуйста, выберите форму> Установить свойство CausesValidation на true

Нажмите кнопку ОК и снова установите для свойства CausesValidation значение true

и тогда он позаботится обо всех проверках.

Важные моменты: 1) Вы должны указать e.Cancel=true во всех проверяющих обработчиках событий

2) Если ваши кнопки находятся на панелях, вы должны установить свойства CausesValidation панелей (или любого родительского элемента управления) на true

Edit:

3) Проверка пожаров непосредственно перед потерей фокуса. При нажатии Enter будет вызвать кнопку по умолчанию, чтобы нажать, она не перемещает фокус на это кнопка, следовательно, событие проверки не будет запущено, если вы установили свойство AcceptButton форм в кнопку ОК

2 голосов
/ 08 сентября 2011

Сначала обязательно отмените проверку, если в любом из текстовых полей есть ошибки проверки.Например:

private void nameTextBox_Validating(object sender, CancelEventArgs e) {
    if (nameTextBox.Text.Length == 0)
    {
        e.Cancel = true;
        return;
    }
}

Теперь добавьте следующий код в начало действия кнопки ОК:

if (!ValidateChildren())
    return;

Это вызовет событие проверки для всех элементов управления в форме,

1 голос
/ 18 августа 2011

Вы также можете использовать этот простой код. простое введение простой логической переменной с именем hasError может сделать эту работу.

    public partial class Form1 : Form
    {
        private bool hasError;
        public Form1()
        {
            InitializeComponent();
        }

        private void OkBtn_Click(object sender, EventArgs e)
        {
            errorProvider1.Clear(); hasError=false;
            if (ValidateTxt.Text.Length == 0)
            {
                errorProvider1.SetError(ValidateTxt, "must have a value");
                hasError=true;
            }
            if (!hasError)
            {
                //Do what you want to do and close your application
                Close();
            }

        }

        private void CancelBtn_Click(object sender, EventArgs e)
        {
            Close();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...