4

我对使用验证还很陌生。我有一个 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,在我使用事件验证整个表单之前启用它们,然后再次禁用它们。

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

4

6 回答 6

1

我认为这是使用错误提供程序组件进行验证的最佳方式

(或)试试这个

http://www.c-sharpcorner.com/uploadfile/john_charles/validating-data-entry-in-windows-forms-application/

于 2012-04-12T17:44:33.470 回答
1

我认为您正在寻找的是您在设置时获得的行为

form.Autovalidate = Disable

或者

form.Autovalidate = EnableAllowFocusChange
于 2013-11-25T05:43:39.380 回答
0

我使用了以下几行:

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

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

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

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

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

于 2012-04-12T18:41:42.937 回答
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);
        }
    }
于 2013-09-04T14:35:04.643 回答
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);
       }
}
于 2016-02-17T14:45:20.920 回答
0

所以我知道我有点晚了。但是这个问题也让我很痛苦

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

private void btnCancel_MouseEnter(object sender, EventArgs e)
        {
            AutoValidate = AutoValidate.Disable;
        }

private void btnCancel_MouseLeave(object sender, EventArgs e)
        {
            AutoValidate = AutoValidate.EnablePreventFocusChange;
        }

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

于 2016-06-30T09:11:34.347 回答