使用ErrorProvider和验证事件进行表单验证

时间:2012-04-12 17:13:43

标签: c# winforms error-handling validation

我很擅长使用验证。我有一个C#winform项目,我希望在关闭前验证表单。但是,我只想在单击按钮时进行此验证。所以我有一个像这样的事件:

if (!this.ValidateChildren())
{
   MessageBox.Show("Validation failed");
}
else
{
   MessageBox.Show("Validation passed with flying colours. :)");
   this.Close();
}

如果验证成功,我只想关闭表单。很容易。但是,我不希望在文本框失去焦点时运行验证,只有在验证整个表单时才会运行。

我想要验证的每个控件,我已经注册了“验证”事件。他们使用“e.Cancel = true;”取消验证。我一直在使用ErrorProvider类来直观地支持它。

基本问题,只有当我想要而不是从控件中丢失焦点时才验证特定控件集的最佳方法是什么?

编辑:目前作为一种解决方法,我有一个方法可以打开和关闭“CausesValidation”属性。我默认所有内容都不是CauseValidation,在我使用事件验证整个表单之前启用它们,然后再次禁用它们。

我真的不认为这是一种理想的方法。还有更优雅的解决方案吗?

6 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

我认为你要找的是你设置

时获得的行为
form.Autovalidate = Disable

form.Autovalidate = EnableAllowFocusChange

答案 2 :(得分:0)

我使用了以下几行:

1)定义要在某种集合中验证的控件。

2)编写一个验证例程,可能直接在按钮点击下,循环控制集合,检查控件内容的值/有效性。如果验证很复杂,可能会按照每个控件的私有方法推迟。

3)如果控件的内容无效,请将其与验证消息一起传递给ErrorProvider的SetError方法。

4)根据有效状态,让表单关闭(DialogResult = OK)或保持表单打开(DialogResult = None)。

如果您这样做,您可以将验证重构为带有ErrorProvider的基本表单并从中继承。

答案 3 :(得分:0)

    private void TxtNama_Validating(object sender, CancelEventArgs e)
    {
        e.Cancel = string.IsNullOrEmpty(TxtNama.Text);
        this.errorProvider1.SetError(TxtNama, "Nama Barang Harus Diisi..!!");            
    }

    private void CmdSave_Click(object sender, EventArgs e)
    {
        if(this.ValidateChildren(ValidationConstraints.Enabled))
        {
            MessageBox.Show("Simpan Data Barang..?" , "SIMPAN DATA", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
        }
    }

答案 4 :(得分:0)

上面的示例工作得很好,但将 errorProvider 对象与按钮结合起来很有意思。在验证失败时, object.ValidateChildren() 方法需要一点点才能返回false。

关键似乎是将 CancelEventargs.Cancel 属性设置为true;回想起来很明显,但也许这会节省别人的时间。

    Form1.Autovalide = Disabled

    private void textBox2_Validating(object sender, CancelEventArgs e)
    {
       if (textBox2.Text.Length == 0)
       {
          errorProvider1.SetError(textBox2, "Must provide an entry.");
          e.Cancel = true;
       } else {
          errorProvider1.SetError(textbox2, "");
       }
    }

    private void button1_click(object sender, EventArgs e)
    {
       if (this.ValidateChildren(ValidationConstraints.Enabled | ValidationConstraints.ImmediateChildren))
       {
          MessageBox.Show("All's well.", "Valid", MessageBoxButtons.OK);
       }  else {
          MessageBox.Show("All is ruin and woe!", "Invalid", MessageBoxButtons.OK);
       }
}

答案 5 :(得分:0)

所以我知道我迟到了。但这个问题也困扰我了

我最终做的是使用取消按钮MouseEnter和MouseLeave事件

select SUM(WasteValue) as WasteValue from(
select sum(im.Pur_Rate *wd.Item_Qty) as WasteValue  from [Item Master] im 
inner join [waste Details] wd on wd.Item_Code=im.Item_Code
inner join [waste Master] wm on wd.Waste_No=wm.Waste_No 
and CONVERT(date,wm.Waste_Date,120)BETWEEN '2016-06-30' 
and '2016-06-30' and im.Type_Code=1 and im.Branch_Code=0
union
select sum(im.Pur_Rate *wd.Item_Qty) as WasteValue  from [Item Master] im 
inner join [Counter Waste Details] wd on wd.Item_Code=im.Item_Code
inner join [Counter Waste Master] wm on wd.Waste_No=wm.Waste_No 
and CONVERT(date,wm.Waste_Date,120)BETWEEN '2016-06-30' 
and '2016-06-30' and im.Type_Code=1 and im.Branch_Code=0)Wastage

当我输入单击按钮时,这将禁用验证,然后单击时可以触发取消按钮单击事件,我可以执行其中所需的任何逻辑,包括清除错误。