2016-04-24 71 views
1

我在一个c#winforms应用程序中使用errorprovider。 现在我想要进行“双重”验证。直接在文本字段上,以便用户看到他犯了一些错误,并且一次在按钮上。所以当仍有错误时,“保存”按钮将保持灰色或“禁用”。错误提供程序c#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”之下,但这也不起作用。由于焦点丢失。

任何人有更好的想法呢?我一直在寻找谷歌,我发现的唯一的事情是与errorprovider单个验证,或事件验证。但是这些事件不允许用户随时编辑他们的错误。它将它们阻塞到一个特定的文本字段中。

+0

此ValidateChildren()函数如何工作?因为微软网站上的例子并不十分清楚。它实际上不工作,所以我必须做错事... https://msdn.microsoft.com/en-us/library/ms158374(v=vs.110).aspx – Kevin

+1

不得不猜测“它不工作“,你可能从未在你的Validating事件处理器中设置e.Cancel = true。所以ValidateChildren()方法不知道任何事情都没有验证。另一种方法是计算显示的数字或错误图标,请考虑使用[this class](http://stackoverflow.com/a/2682478/17034)。 –

+0

汉斯,“不起作用”有点不客气。我实际上设置了e.cancel,但后来我再次将我的用户锁定到一个文本框中。在我的论坛中,这不是那么用户友好。我面临的问题是我从来没有进入else操作符。换句话说,我从来没有“验证失败”。 – Kevin

回答

1

您不需要禁用保存按钮。检查ValidateChildren表单的方法就足够了,如果它返回false,则意味着有一些验证错误。要使用这种方法,您应该记得在为控件设置错误时在控件的Validating事件中设置e.Cancel = true

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

也让用户即使有错误控件之间移动,在设计或使用代码的FormAutoValidate属性设置为EnableAllowFocusChange