如何避免重复验证事件 Winforms

Posted

技术标签:

【中文标题】如何避免重复验证事件 Winforms【英文标题】:How to avoid duplication of validation events Winforms 【发布时间】:2017-06-02 08:04:15 【问题描述】:

我正在创建一个包含三个表单的项目,一个父表单将决定加载哪个表单。由于两个子表单略有相似,因此很多验证是相同的。我有我的验证方法,然后在Validating event 中调用我如何才能最大限度地减少Validating events 中的重复量,并且只有一种方法具有一个验证事件,该方法可以控制我所有共享该方法的控件.

这是我在整个过程中广泛使用的方法的一个示例:

public bool numValidation(string strNum)       

    if (!string.IsNullOrWhiteSpace(strNum))
    
        int temp;
        if (int.TryParse(strNum, out temp))
        
            MessageBox.Show("Phone Number is a valid input: " + temp);
            return true;
        
        else
        
            MessageBox.Show(temp + "Is not Valid input!!");                            
                
    

    return false;

这只是我的许多验证事件之一:

private void txt_LndLine_Validating(object sender, CancelEventArgs e)

    numValidation(txt_LndLine.Text);
    txt_LndLine.Clear();

我真的很想知道如何清理代码并最大程度地减少重复。在此先感谢:)

【问题讨论】:

创建一个库项目并将这些常用方法存储在一个静态实用程序类中。并且不要将 UI 元素和逻辑放在这个库中。只需返回 true/false 并让 UI 部分显示消息 谢谢@Steve 所以只需创建静态 utill 类并将我所有的验证方法都放在那里。然后通过创建该类的实例并调用方法来调用它们?还是我应该继承? 或多或少。首先,您不会将所有内容都放在那里,而只是将可以重用的通用代码放在那里,而无需在逻辑上与某种类绑定。其次,如果您的类或方法是静态的,则不需要创建实例。 (对于一个名为 Utility 的类的 IE,您调用了一个名为 numValidation 的静态方法 Utility.numValidation(.....) 如果我必须不包含任何 Ui 元素,我将如何最大限度地减少与 TextBox 相关的验证事件的数量? 这些方法是静态的,因为您没有将它们绑定到特定类的任何特定业务逻辑,并且都在一个名为 Utility 的类中。您不会最小化验证事件。它们属于表单或类的 UI 层。您只是避免将 MessageBox 放在不适合可重用性的实用程序类中(如果您想在某个时候静默失败怎么办?好的,您可以添加一个参数,但这很快就会变得一团糟)。而是将验证结果带到放置 UI 消息的 UI 层。 【参考方案1】:

如果您有很多常见的东西,声明式验证可以帮助您清理代码。

MSDN - Extending Windows Forms with a Custom Validation Component Library

您还可以使用同一个 Sub 处理多个控件验证事件,使用帮助类来重用验证计算函数。

最后但同样重要的是,阅读有关 IDataErrorInfo 的信息。使用此接口,您可以将所有验证算法放在您的业务类中。

使用 ErrorProvider 组件和数据绑定在 Winforms 中运行良好

【讨论】:

【参考方案2】:

感谢@Steve 解决了更好的代码。通过创建一个单独的静态类并简单地在我所有的Validating Events 中调用该方法来解决,这两个页面都有共同的功能。

  private void txt_Fax_Validating(object sender, CancelEventArgs e)
        
            Utillity.numValidation(txt_Fax.Text);
            txt_Fax.Clear();

        

Utility 类如下:

public static bool numValidation(string strNum)
    
        if (!string.IsNullOrWhiteSpace(strNum))
        
            int temp;
            if (int.TryParse(strNum, out temp))
            
                Console.WriteLine("Phone Number is a valid input: " + temp);
                return true;
            
            else
             Console.WriteLine(temp + "Is not Valid input!!"); 
        
        return false;
    

【讨论】:

以上是关于如何避免重复验证事件 Winforms的主要内容,如果未能解决你的问题,请参考以下文章

如何避免jQuery UI可拖动也触发点击事件[重复]

如何避免jQuery UI可拖动也触发点击事件[重复]

如何避免在 TensorFlow 中添加重复的集合?

如果托管bean没有更新,如何在事件onblur上使用ajax验证字段[重复]

用jquery怎么验证名字在输入完之后马上提示有没有重复的代码

Facebook 像素购买事件重复数据删除