2015-10-12 46 views
0

如何在WinForms中存在错误时显示消息框“数据无效”。 试过类似的东西,但它不起作用。使用验证事件和ErrorProvider进行验证 - 显示错误摘要

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. 
    } 
+0

如果您对解决方案有任何疑问,请告知我们。另外,当您找到有用的答案时,您可以点击问题附近的复选标记以接受答案。您只能接受一个答案,而您可以投出尽可能多的答案,因为您可以找到有用的答案,包括通过点击向上箭头接受答案。这样你使答案更有帮助。你也可以为好问题投票。 :) –

回答

2

你应该先纠正你的验证事件是这样的:

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); 
    } 
} 

样本屏幕截图:

enter image description here

注:

  • 你不应该使用错误提供商Clear方法来设置有效状态来控制,你应该使用SetError,例如this.errorProvider1.SetError(textBox2, "");
  • 如果存在验证错误,您应该致电e.Cancel=true
  • 在示例代码中,我假设您的所有控件(包括错误提供程序)都直接放在窗体上,而不是放在容器控件中。
  • 我还建议在设计时通过代码形式的AutoValidate属性设置为EnableAllowFocusChangeLoad事件形式的这种方式改变形式的验证行为:

要改变形式的验证行为:

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