Как можно поставить намордник на компонент ErrorProvider?

Я пытаюсь использовать компонент ErrorProvider.

У меня есть кнопка «Закрыть» в форме, и, конечно, у нее также есть «X» для закрытия в северо-восточном углу формы.

Однако после того, как ошибка была «поднята», нажатие кнопки «Закрыть» или окна «Закрыть» (или как там это ни называется) не отвечает/не работает.

Что я должен сделать, чтобы пользователь мог закрыть форму, если в ней есть ошибки?

Обновлять:

Вот код, который я сейчас пробую в обработчике OnClick() кнопки "Закрыть" - он все еще отказывается закрываться:

private void buttonCancel_Click(object sender, EventArgs e) {
  formValidation.SetError(this, String.Empty);
  Close();
}

Обновлено снова: просто для гримас, я попытался изменить свойство "DialogResult" с "Отменено" на "Нет" на кнопке "Закрыть", но это не помогло (не ожидал - хватался за соломинку)

Также не изменилось свойство кнопки «Проверка причин» с True на False...

Обновлено еще раз:

Вот все, что может быть или не быть подходящим для публикации:

        . . .
              const int MINIMUM_PASSWORD_LENGTH = 5;

        private string originalPassword {
            get { return textCurrentPassword.Text; }
        }

        private string newCandidatePassword1 {
            get { return textNewPassword.Text; }
        }

        private string newCandidatePassword2 {
            get { return textNewPasswordRepeated.Text; }
        }

        public ChangePassword() {
            InitializeComponent();
        }

        private void textCurrentPassword_Validating(object sender, CancelEventArgs e) {
            string error = null;

            if (originalPassword.Equals(String.Empty)) {
                error = currentPasswordInvalid;
                e.Cancel = true;
                //textCurrentPassword.Focus(); probably unnecessary because of .SetError() below
            };

            // TODO: Replace 1==2 with call that compares password with the current user's confirmed password
            if (1 == 2) {
                error = currentPasswordDoesNotMatchCurrentUser;
                e.Cancel = true;
            }

            formValidation.SetError((Control)sender, error);
            if (null != error) {
                ;
            }
        }

        private void textNewPassword_Validating(object sender, CancelEventArgs e) {
            string error = null;

            if (newCandidatePassword1.Length < 5) {
                error = newPasswordInvalid;
                e.Cancel = true;
            }

            formValidation.SetError((Control)sender, error);
            if (null != error) {
                ;
            }
        }

        private void textNewPasswordRepeated_Validating(object sender, CancelEventArgs e) {
            string error = null;

            // Long enough?
            if (newCandidatePassword2.Length < MINIMUM_PASSWORD_LENGTH) {
                error = newPasswordInvalid;
                e.Cancel = true;
            }

            // New passwords match?
            if (!newCandidatePassword2.Equals(newCandidatePassword1)) {
                error = newPasswordsDoNotMatch;
                e.Cancel = true;
            }

            // They match, but all three match (undesirable)
            if (!originalPassword.Equals(newCandidatePassword1)) {
                error = newPasswordSameAsOld;
                e.Cancel = true;
            }

            // Unique across the user base?
            // TODO: Replace 1==2 with call that verifies this password is unique 
            if (1 == 2) {
                error = newPasswordNotUnique;
                e.Cancel = true;
            }

            formValidation.SetError((Control)sender, error);
            if (null != error) {
                ;
            }
        }

        private void buttonCancel_Click(object sender, EventArgs e) {
            foreach (Control ctrl in this.Controls) { 
                formValidation.SetError(ctrl, string.Empty); 
            } 
            Close(); 
        }

person B. Clay Shannon    schedule 12.04.2012    source источник


Ответы (1)


Вы можете попробовать очистить SetError в обработчике кнопки «Закрыть»:

private void buttonCancel_Click(object sender, EventArgs e)
{
    foreach (Control ctrl in this.Controls)
    {
        formValidation.SetError(ctrl, string.Empty);
    }
    Close();
}

Также дважды проверьте, что ваша кнопка «Отмена» действительно подключена к этому обработчику. Поставьте точку останова и убедитесь, что вы хотя бы попадаете в эту функцию.

person Brad Rem    schedule 12.04.2012
comment
Это дает мне, Невозможно назначить "SetError", потому что это "группа методов" - person B. Clay Shannon; 13.04.2012
comment
@Clay, можешь показать мне код в обработчике нажатия кнопки. Я также исправил свой код, поскольку я разместил его по памяти. - person Brad Rem; 13.04.2012
comment
Опубликовано выше. Это это! (цитата из фильма для достижения минимального требования к персонажу). - person B. Clay Shannon; 13.04.2012
comment
@ClayShannon, обновленный код, хотя я не уверен, что errorProvided препятствует закрытию вашей программы. Можете ли вы закрыть его, когда нет ошибок в исходном коде? - person Brad Rem; 13.04.2012
comment
нет, не доходит. Но я думаю, это потому, что мой ответ - установить фокус на TextBox с ошибкой. Я прокомментирую это и посмотрю, что произойдет... - person B. Clay Shannon; 13.04.2012
comment
нет, я не могу, потому что он видит, что одно из текстовых полей пусто, и переходит туда... видимо, моя философия ErrorProvider неверна. - person B. Clay Shannon; 13.04.2012
comment
Я вижу, что уже закомментировал вызовы .Focus(). Итак, я перехожу к делу и публикую весь соответствующий код выше. Либо я делаю что-то принципиально обратное, либо происходит что-то очень странное (или и то, и другое). - person B. Clay Shannon; 13.04.2012
comment
@ClayShannon, e.Cancel = true; твой виновник. Это останавливает событие проверки и не позволяет вам отключить элемент управления, пока пользователь не исправит ошибку. - person Brad Rem; 13.04.2012
comment
Удаление e.Cancel = true позволяет закрыть форму; тем не менее, вам нужно дважды щелкнуть кнопку «Закрыть» для любого из них: один раз, чтобы 86 мигал значок ошибки, а затем еще раз, чтобы закрыть его. - person B. Clay Shannon; 13.04.2012