使用 Validating 事件和 ErrorProvider 进行验证 - 显示错误摘要
Validation using Validating event and ErrorProvider - Show Error Summary
当我的 WinForms 中有错误时如何显示 Messagebox "Data is invalid"。
尝试过类似的方法但它不起作用。
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.
}
您应该首先以这种方式更正您的验证事件:
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 is 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
method of error provider to set valid state to control, you should use SetError
,例如 this.errorProvider1.SetError(textBox2, "");
- 当出现验证错误时,您应该调用
e.Cancel=true
。
- 在示例代码中,我假设您的所有控件(包括错误提供程序)都直接放置在您的表单上而不是容器控件中。
- 我还建议通过在设计时将表单的
AutoValidate
属性 设置为 EnableAllowFocusChange
或通过此表单的 Load
事件中的代码来更改表单的验证行为方式:
要更改表单的验证行为:
this.AutoValidate = System.Windows.Forms.AutoValidate.EnableAllowFocusChange;
当我的 WinForms 中有错误时如何显示 Messagebox "Data is invalid"。 尝试过类似的方法但它不起作用。
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.
}
您应该首先以这种方式更正您的验证事件:
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 is 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
method of error provider to set valid state to control, you should useSetError
,例如this.errorProvider1.SetError(textBox2, "");
- 当出现验证错误时,您应该调用
e.Cancel=true
。 - 在示例代码中,我假设您的所有控件(包括错误提供程序)都直接放置在您的表单上而不是容器控件中。
- 我还建议通过在设计时将表单的
AutoValidate
属性 设置为EnableAllowFocusChange
或通过此表单的Load
事件中的代码来更改表单的验证行为方式:
要更改表单的验证行为:
this.AutoValidate = System.Windows.Forms.AutoValidate.EnableAllowFocusChange;