2

我在 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);
            }
        }
    }
4

2 回答 2

4

我建议使用 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");
           }
    }
于 2013-10-11T11:39:25.860 回答
1

在每个控件上将 CausesValidation 属性设置为 false 以防止它在焦点离开时调用验证方法,此处对事件顺序进行说明:

如果 CausesValidation 属性设置为 false,则会抑制 Validating 和 Validated 事件。

显然,如果需要,您可以在调用 ValidateChildren 之前重新启用它们。

于 2013-10-11T11:35:02.427 回答