错误提供程序c#winforms
问题描述:
我在一个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单个验证,或事件验证。但是这些事件不允许用户随时编辑他们的错误。它将它们阻塞到一个特定的文本字段中。
答
您不需要禁用保存按钮。检查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
}
}
也让用户即使有错误控件之间移动,在设计或使用代码的Form
的AutoValidate
属性设置为EnableAllowFocusChange
此ValidateChildren()函数如何工作?因为微软网站上的例子并不十分清楚。它实际上不工作,所以我必须做错事... https://msdn.microsoft.com/en-us/library/ms158374(v=vs.110).aspx – Kevin
不得不猜测“它不工作“,你可能从未在你的Validating事件处理器中设置e.Cancel = true。所以ValidateChildren()方法不知道任何事情都没有验证。另一种方法是计算显示的数字或错误图标,请考虑使用[this class](http://stackoverflow.com/a/2682478/17034)。 –
汉斯,“不起作用”有点不客气。我实际上设置了e.cancel,但后来我再次将我的用户锁定到一个文本框中。在我的论坛中,这不是那么用户友好。我面临的问题是我从来没有进入else操作符。换句话说,我从来没有“验证失败”。 – Kevin