更改文本框焦点时,停止触发验证事件
本文关键字:验证 事件 文本 焦点 | 更新日期: 2023-09-27 18:35:01
我在winforms c#项目中对texbox组件进行验证时遇到问题。
我在"创建产品"表单中有几个文本框,用于验证数字、空字符串等。如果我从一个文本框(带有验证(转到另一个文本框,验证事件将触发,并且我无法更改焦点,即我卡在文本框上,直到我键入一些内容。我正在寻找的行为应该在我点击"创建按钮"时触发文本框上的验证事件,而不是当我将焦点从一个文本框切换到另一个文本框时。
有什么提示,或如何解决这个问题的好做法?非常感谢..
当前代码:
//Validation event for one of the textboxes. epProductName is an ErrorProvider:
private void txtProductName_Validating(object sender, CancelEventArgs e)
{
if (Validator.IsEmpty(txtProductName))
{
epProductName.SetError(txtProductName, "Field must not be empty");
e.Cancel = true;
}
else
{
epProductName.Clear();
}
}
//Submit button click event
private void btnSubmit_Click(object sender, EventArgs e)
{
if (ValidateChildren())
{
try
{
SelectedProduct.ImagePath = txtChoosePicture.Text;
SelectedProduct.InstructionPath = txtChooseManual.Text;
SelectedProduct.SheetPath = txtChooseDatasheet.Text;
SelectedProduct.IsDeleted = false;
SelectedProduct.ProductNameNum = txtProductName.Text;
SelectedProduct.Description = txtProductDescription.Text;
SelectedProduct.DaysToExpire = int.Parse(txtUseTime.Text);
SelectedProduct.Category_Id = (int)cbChooseCategory.SelectedValue;
int productId = pm.CreateProduct(SelectedProduct);
MessageBox.Show("New Product: Id: " + productId + ", Product name: " + SelectedProduct.ProductNameNum, "New product created",
MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
this.Dispose();
}
catch (Exception ex)
{
MessageBox.Show("Product was not created. Details: " + ex.Message, "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
}
}
}
我建议使用 ErrorProvider 控件(就像您已经使用的那样(,但根本不使用该控件的验证。基本上,在按下按钮时,您将检查字段的值,然后在错误提供程序上使用.SetError
方法。
另一种方法是使用窗体的ValidateChildren
方法。可以跟踪是否应进行验证,并仅在需要时允许验证,也可以对所有控件使用 CausesValidation 属性进行操作。这是第一个选项,
private bool _validate = false;
private void button1_Click(object sender, EventArgs e)
{
_validate = true;
this.ValidateChildren();
_validate = false;
}
private void textBox1_Validating(object sender, CancelEventArgs e)
{
if (_validate==true)
{
errorProvider1.SetError(textBox1, "test");
}
}
在每个控件上将 CausesValidation 属性设置为 false,以防止它在焦点离开时调用验证方法,此处说明事件的顺序:
如果"原因验证"属性设置为 false,则"正在验证"和"验证"和 已验证的事件将被抑制。
显然,如果需要,您可以在调用 ValidateChildren 之前重新启用它们。