Проверка с использованием события Validating и ErrorProvider - Показать сводку об ошибках
Как отобразить окно "Данные неверны", если в моих WinForms остались ошибки. Пробовал что-то подобное, но это не работает.
if (errorprovider1 == !null)
{
MessageBox.Show("Data is invalid");
}
Возможно я должен использовать bool для этого решения.
Мой полный код:
private void Form1_Load(object sender, EventArgs e)
{
this.Text = "Formas elementu validācija";
}
private void textBox1_Validating(object sender, CancelEventArgs e)
{
Regex regex1 = new Regex(@"^[a-zA-Z]+$");
if (!regex1.IsMatch(textBox1.Text))
{
errorProvider1.SetError(textBox1, "Nosaukums nedrīskt saturēt ciparus!");
}
else
{
errorProvider1.Clear();
}
}
private void textBox2_Validating(object sender, CancelEventArgs e)
{
Regex regex1 = new Regex(@"^[0-9]+$");
if (!regex1.IsMatch(textBox2.Text))
{
errorProvider2.SetError(textBox2, "Reģ.nur drīkst saturēt TIKAI ciparus!");
}
else
{
errorProvider2.Clear();
}
}
private void button1_Click(object sender, EventArgs e)
{
// if errorProvider1 is empty (no errors) , show messagebox with text: All data correct.
// else Data is incorrect.
}
1 ответ
Решение
Сначала вы должны исправить свои проверочные события следующим образом:
private void textBox1_Validating(object sender, CancelEventArgs e)
{
Regex regex1 = new Regex(@"^[a-zA-Z]+$");
if (!regex1.IsMatch(textBox1.Text))
{
//To set validation error
errorProvider1.SetError(textBox1, "Nosaukums nedrīskt saturēt ciparus!");
//To say the state of control in invalid
e.Cancel = true;
}
else
{
//To clear the validation error
this.errorProvider1.SetError(this.textBox1, "");
}
}
Тогда вы должны использовать ValidateChildren
метод, чтобы проверить, есть ли ошибка проверки или нет, тогда вы можете получить список всех ошибок и показать пользователю таким образом:
private void button1_Click(object sender, EventArgs e)
{
if (this.ValidateChildren())
{
//Here the form is in valid state
//Do what you need when the form id valid
}
else
{
var listOfErrors = this.errorProvider1.ContainerControl.Controls.Cast<Control>()
.Select(c => this.errorProvider1.GetError(c))
.Where(s => !string.IsNullOrEmpty(s))
.ToList();
MessageBox.Show("Please correct validation errors:\n - " +
string.Join("\n - ", listOfErrors.ToArray()),
"Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
Пример скриншота:
Замечания:
- Вы не должны использовать
Clear
метод поставщика ошибок, чтобы установить правильное состояние для контроля, вы должны использоватьSetError
, напримерthis.errorProvider1.SetError(textBox2, "");
- Вам следует позвонить
e.Cancel=true
когда есть ошибка проверки. - В примерах кода я предполагаю, что все ваши элементы управления, включая поставщика ошибок, размещены непосредственно в вашей форме, а не в элементе управления контейнером.
- Я также рекомендую изменить поведение проверки формы, установив
AutoValidate
свойство формы дляEnableAllowFocusChange
во время разработки кода вLoad
Событие формы таким образом:
Чтобы изменить поведение проверки формы:
this.AutoValidate = System.Windows.Forms.AutoValidate.EnableAllowFocusChange;