Ошибка провайдера 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
}
}