Ошибка провайдера C# winforms

Я работаю с errorprovider в приложении aC# winforms. Теперь я хочу провести "двойную" проверку. Один раз непосредственно над текстовыми полями, поэтому пользователь видит, что он допустил некоторые ошибки, а один раз - над самой кнопкой. Поэтому, когда все еще есть ошибки, кнопка "Сохранить" будет оставаться серой или "отключенной".

Потому что я не хочу блокировать своего пользователя, когда он делает ошибку, и я хочу, чтобы он мог вносить изменения всякий раз, когда он хочет, чтобы я использовал событие "уйти" или потерял фокус. Это потому, что в противном случае я заметил, что вы не можете перейти в другое поле, пока не измените свою ошибку.

Итак, теперь код:

    private void txtFirstname_Leave(object sender, EventArgs e)
    {
        if (!InputChecks.IsFilledIn(txtFirstname.Text))
        {
            errorProvider1.SetError(txtFirstname, "Firstname needs to be filled in!");
            isValidated = false;

        }
        else
        {
            errorProvider1.SetError(txtFirstname, "");
            isValidated = true;

        }
    }

Все идет нормально. Поставщик ошибок работает правильно, и мой пользователь может редактировать в любое время.

 public void setSaveButton()
    {
        if (isValidated == true)
        {
            btnSave.Enabled = true;

        }
        else
        {
            btnSave.Enabled = false;
        }   
    }

 bool isValidated;
    private void btnSave_Click(object sender, EventArgs e)
    {

        if (isValidated == true)
        {

            employeePresenter.addEmployee(txtFirstname.Text, txtLastname.Text, txtUsername.Text, txtPassword.Text);
        }



    }

Это было все еще хорошо в моей голове. НО, поскольку я даю пользователю возможность изменять проблемы в любое время, это не работает. Я попытался поместить метод "setSaveButton()" в "isvalidated", но это тоже не работает. Из-за потерянного фокуса.

У кого-нибудь есть идея получше? Я искал в Google, и единственное, что я нашел, было единственная проверка с поставщиком ошибок, или проверка события. Но эти события не позволяют пользователям редактировать свои ошибки, когда они хотят. Он блокирует их в одно конкретное текстовое поле.

1 ответ

Решение

Вам не нужно отключать кнопку сохранения. Достаточно проверить ValidateChildren метод вашей формы, и если он вернул false, это означает, что произошла ошибка проверки. Чтобы использовать этот подход, вы должны не забыть установить e.Cancel = true в Validating событие управления, когда вы устанавливаете ошибку для управления.

Также, чтобы позволить пользователю перемещаться между элементами управления, даже если есть ошибка, установите AutoValidate собственность вашего Form в EnableAllowFocusChange в дизайнере или используя код:

this.AutoValidate = System.Windows.Forms.AutoValidate.EnableAllowFocusChange;

Код для проверки:

private void txtFirstname_Validating(object sender, CancelEventArgs e)
{
    if (string.IsNullOrEmpty(this.txtFirstname.Text))
    {
        this.errorProvider1.SetError(this.txtFirstname, "Some Error");
        e.Cancel = true;
    }
    else
    {
        this.errorProvider1.SetError(this.txtFirstname, null);
    }
}

private void btnSave_Click(object sender, EventArgs e)
{
    if (this.ValidateChildren())
    {
        //Here the form is in a valid state
        //Do what you need when the form is valid
    }
    else
    {
        //Show error summary
    }
}
Другие вопросы по тегам