【问题标题】:Validation in Windows FormWindows 窗体中的验证
【发布时间】:2013-03-22 09:07:02
【问题描述】:

我正在开发一个 Windows 窗体应用程序,它有很多窗体,每个窗体都有几个控件。为了实现验证,我必须为每个控件实现“验证”事件,如下所示:

    private void txtSalary_Validating(object sender, CancelEventArgs e)
    {
        if (txtSalary.Text.Trim() == String.Empty)
        {
            errorProvider1.SetError(txtSalary, "Salary is Required");
            e.Cancel = true;
        }
        else
            errorProvider1.SetError(txtSalary, "");

    }

有什么方法可以让我做一些通用的事情吗?我可以通过代码以通用方式将事件与控件相关联,而不是为每个控件(表单设计视图 - 控件属性)声明性地定义“验证”事件吗?

【问题讨论】:

  • 你检查我的答案了吗?

标签: winforms


【解决方案1】:

每个表单只能使用一个事件,例如,您可以使用类似的东西

private void textboxValidation_Validating(object sender, CancelEventArgs e)
{
    TextBox tb = sender as TextBox;

    if (string.IsNullOrEmpty(tb.Text.Trim()))
    {
        errorProvider1.SetError(tb, tb.Tag +" is Required");
        e.Cancel = true;
    }
    else
        errorProvider1.SetError(tb, "");
}

这可以用于表单中的所有文本框,您只需在其 Tag 属性中添加每个文本框所需的内容。

也可以对所有表单使用一个事件。看看Set up single event handler for multiple forms

【讨论】:

  • 谢谢。但是我如何为所有控件关联 textboxValidation_Validating 事件?此外,我想使用代码将事件与所有控件挂钩
  • 要以编程方式将事件关联到文本框,请使用 textBox1.Validating += new CancelEventHandler(textboxValidation_Validating);其中 textBox1 将是文本框的名称,而 textboxValidation_Validating 应该是您的验证事件的名称。
  • @kaus 查看我的答案,了解一种自动为表单上的所有文本框控件执行此操作的方法(代码在 cmets 中的格式不正确)
【解决方案2】:

您可以创建一个用于验证的分隔符方法并在单击按钮时调用它,试试这个:

private void SubmitButton_Click(object sender, EventArgs e)
    {
        if (ValidateControls()==0)
        {
           //Form is validated
        }
    }

    int ValidateControls()
    {
        int flag = 0;
        errorProvider1.Clear();
        if (txtAge.Text.Trim() == String.Empty)
        {
            errorProvider1.SetError(txtAge, "Age is required");
            flag = 1;
        }
        ............................................
        ............................................
       // validate all controls
        ............................................
        ............................................

        if (txtSalary.Text.Trim() == String.Empty)
        {
            errorProvider1.SetError(txtSalary, "Salary is required");
            flag = 1;
        }

        return flag;
    }

【讨论】:

    【解决方案3】:

    如果您的所有输入都属于同一类型并且您可以对每个输入进行相同的验证并且您一致地命名您的控件,coolmine 的答案可以是通过在表单的构造函数中添加类似以下代码(在初始化之后)来扩展:

    foreach(Control c in Controls)
    {
        if(c is TextBox)
        {
            c.Tag = c.Name.Replace("txt","");
            c.Validating += textboxValidation_Validating;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-13
      相关资源
      最近更新 更多