【问题标题】:Validating Data In A WinForm在 WinForm 中验证数据
【发布时间】:2011-10-29 21:01:33
【问题描述】:

我在我的 WinForms 应用程序中创建了一个对话框。这有许多文本框和确定/取消按钮。当用户单击确定时,我只希望在所有条目都有效时关闭对话框。我可以看到如何分别使用每个控件的“验证”事件来做到这一点。没事儿。但这些似乎只有在控件失去焦点时才会触发。但是,我的对话框中的空文本框也是无效输入,这意味着用户可能从未关注过该控件。我宁愿在点击 OK 时验证所有控件。

但我不知道该怎么做。覆盖 OK 按钮的 onclick 似乎没有停止窗口关闭的选项。 Form IsClosing 事件通过设置 Cancel = true 来实现。但这似乎无法区分是单击确定还是取消按钮。显然,如果单击取消按钮,我不关心验证,并且无论如何都希望允许表单关闭。

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

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

【问题讨论】:

  • 为什么你不能调用你的验证(我建议你看看数据绑定并顺便验证你的绑定对象)方法 onclick 为 ok 按钮然后不关闭验证失败?单击确定时,您的表单不应神奇地关闭。

标签: c# .net winforms


【解决方案1】:

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

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

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

if (!ValidateChildren())
    return;

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

【讨论】:

    【解决方案2】:

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

    选择确定按钮并再次将属性CausesValidation 设置为true

    然后它会处理所有的验证。

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

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

    编辑:

    3) 在失去焦点之前验证火灾。按下 Enter 的同时 导致默认按钮单击,它不会将焦点移至该按钮 按钮,因此如果您将表单 AcceptButton 属性设置为 OK 按钮,则不会触发验证事件

    【讨论】:

    • 我在两者中都将 CausesValidation 设置为 true,当我单击确定时它仍然不会调用我的验证事件。不幸的是,这就是我提出这个问题的全部原因。
    • @Jonnster:你把Button所有父控件的CausesValidation属性都设置为true了吗?
    • 是的,所有父控件都将 CausesValdiation 设置为 true。我没有在表单上设置 AcceptButton 属性。
    【解决方案3】:

    您也可以使用这个简单的代码。只需引入一个名为 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();
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-04
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多