c# - 使用 this.validateChildren() 时如何针对所有无效表单控件设置 errorProvider?

标签 c# winforms validation errorprovider

如果我在这里忽略了一些明显的东西,我深表歉意。

问题背景

我有一个允许用户填写表格的应用程序,其内容将被上传到数据库。当他们点击“上传”按钮时,必须验证表单。如果任何字段无效,将提醒用户。

当前解决方案

当用户点击按钮上传交易时,validFormSelections() 被调用。

if (!this.validateChildren())
{
    // Display an error
    return false;
}
else
{
    return true; 
}

对于每个组合框,都会调用验证方法,例如

cmbName_Validating(object sender, CancelEventArgs e)
{
    if (/* not valid for whatever reason */)
    {
        errorProvider.Clear();
        e.Cancel = true; 
        errorProvider.setError((Control)sender, /* suitable error message */)
    }
    else
    {
        errorProvider.SetError((Control)sender, ""); 
    }
} 

问题

我想做的是在 所有 字段旁边显示 errorProvider,但目前 e.Cancel = true ; 在单个验证方法中,然后(如果我的理解是正确的)一旦找到第一个无效字段,它就不会继续验证其他字段。

如何才能调用 this.validateChildren() 并在所有无效字段旁边显示 errorProvider

目前尝试研究解决方案

  • 据我所知,我的问题是需要将 CancelEventArgsCancel 属性设置为 true,因为它“切断”了其余部分验证。因此,最好找到一种方法来避免稍后设置此属性或找到解决此问题的方法。但我不确定该怎么做。

  • 我最初的想法之一是,如果我可以从每个验证事件处理程序返回一个 boolean,我就可以很容易地解决这个问题(但是我怀疑,并且后来了解到,我不能那样做)。我看到在事件处理程序中返回值的替代方法是传入可变值(例如 CancelEventArgs 本身)。这看起来可能是一个合适的解决方案,但我不确定我自己该如何做......

最佳答案

设置e.Cancel = true当然是问题所在。所以不要那样做。这通常是一个相当令人不快的功能,使数据输入非常模态。一种更友好的方法是让用户自由支配数据输入任务,输入数据的顺序不一定是您在设置 Tab 键顺序时设想的顺序。

只需编写一个小的辅助方法,即可轻松完成。例如:

    private Control firstInvalidControl;

    private void SetValidation(object sender, bool ok, string errMsg) {
        var ctl = (Control)sender;
        if (ok) errorProvider1.SetError(ctl, "");
        else {
            if (firstInvalidControl == null) firstInvalidControl = ctl;
            errorProvider1.SetError(ctl, errMsg);
        }
    }

在控件的验证事件处理程序中调用 SetValidation()。现在您可以很轻松地显示所有适当的警告,并帮助用户导航到他可能需要首先处理的控件。例如:

    private void OKButton_Click(object sender, EventArgs e) {
        firstInvalidControl = null;
        this.ValidateChildren();
        if (firstInvalidControl != null) firstInvalidControl.Focus();
        else {
            // Data is good, use it
            // ...                
        }
    }

关于c# - 使用 this.validateChildren() 时如何针对所有无效表单控件设置 errorProvider?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27421160/

相关文章:

c# - 字节数组在 C# 中的编码方式对 AES 的安全性有影响吗?

javascript - Jquery使用Html 5数据属性和默认值进行自定义验证

angularjs - Angular - ngModelController 缺少 $validators?

c# - 了解隐藏功能

c# - SNK 出现未知错误 (8013141e)

winforms - 就像Form类一样为Winforms Control添加Load事件

vb.net - 从 Windows 窗体关闭命令窗口

c# - 如何加载测试 WinForms 应用程序?

mysql - 在 MySQL 中添加日期字段验证

c# - 实现自定义流