验证WinForm中的数据

时间:2011-08-18 14:46:19

标签: c# .net winforms

我在WinForms应用程序中创建了一个对话框。这有许多文本框和确定/取消按钮。当用户单击“确定”时,如果所有条目都有效,我只希望关闭对话框。我可以分别使用每个控件的“Validating”事件来了解如何执行此操作。那样就好。但是当控件失去焦点时,这些似乎只会触发。但是,对话框中的空文本框也是无效输入,这意味着用户可能永远不会专注于该控件。我更愿意在单击OK时验证所有控件。

我无法解决如何做到这一点。覆盖OK按钮的onclick似乎没有停止关闭窗口的选项。 Form IsClosing事件通过设置Cancel = true来完成。但这似乎无法区分是否单击了“确定”或“取消”按钮。显然,如果单击取消按钮,我不关心验证,并希望允许表单关闭。

这样做的最佳方法是什么?]

更新: 我已经在我的表单和确定按钮上将CausesValidation设置为true,但是当我单击确定按钮时,我的验证事件不会被触发。我提到这个,因为它被建议作为下面的解决方案。

3 个答案:

答案 0 :(得分:5)

请选择表格>将属性CausesValidation设置为true

选择确定按钮,然后再将属性CausesValidation设置为true

然后它会处理所有验证。

重点: 1)您必须在所有验证事件处理程序中提及e.Cancel=true

2)如果您的按钮位于面板中,则必须将面板(或任何父控件)CausesValidation属性设置为true

修改

3)在失去焦点之前验证火灾。按Enter键的同时 导致默认按钮单击,它不会将焦点移动到那个 按钮,因此如果您已将表单AcceptButton属性设置为确定按钮

,则不会触发验证事件

答案 1 :(得分:2)

首先确保在任何文本框出现验证错误时取消验证。例如:

private void nameTextBox_Validating(object sender, CancelEventArgs e) {
    if (nameTextBox.Text.Length == 0)
    {
        e.Cancel = true;
        return;
    }
}

现在将以下代码添加到ok按钮操作的开头:

if (!ValidateChildren())
    return;

这将触发表单上所有控件的验证事件,

答案 2 :(得分:1)

您也可以使用这个简单的代码。只是引入一个名为hasError的简单布尔变量就可以完成这项工作。

    public partial class Form1 : Form
    {
        private bool hasError;
        public Form1()
        {
            InitializeComponent();
        }

        private void OkBtn_Click(object sender, EventArgs e)
        {
            errorProvider1.Clear(); hasError=false;
            if (ValidateTxt.Text.Length == 0)
            {
                errorProvider1.SetError(ValidateTxt, "must have a value");
                hasError=true;
            }
            if (!hasError)
            {
                //Do what you want to do and close your application
                Close();
            }

        }

        private void CancelBtn_Click(object sender, EventArgs e)
        {
            Close();
        }
    }