【问题标题】:Validating user input / Give .NET controls status OK or NOK验证用户输入/给予 .NET 控件状态 OK 或 NOK
【发布时间】:2016-06-29 13:33:36
【问题描述】:

我正在考虑验证用户输入的最佳方式。

让我们想象一些 TextBoxes、CheckBoxes 或任何你喜欢的 .NET 控件,其中用户输入必须被验证为 OK 或 NOK。一旦用户填写了所有必填字段,他就会通过一个按钮提交。

现在我必须知道哪些字段之前被确认为 OK,哪些字段被确认为 NOK。到目前为止,我总是通过为每个控件声明一个全局 bool 变量来告诉我这样的情况来处理这种情况。但我不喜欢那样...

我很确定一定有其他方法!我想要做的是扩展这些 .NET 控件,使用名为 status 或类似的 OK 或 NOK 属性。你能做到吗?如果是这样,你怎么做?类似的东西已经存在了吗?

感谢您的回复!

【问题讨论】:

标签: c# .net winforms


【解决方案1】:

将要验证的控件的名称保存到数组中,然后循环遍历它们。如果需要,您还可以在它们上设置验证功能。

var elements = new[] {
    new { Control = textBox1 },
    new { Control = textBox2 }
};

foreach (var elem in elements)
{
    elem.Control.BackColor = string.IsNullOrWhiteSpace(elem.Control.Text) ? Color.Yellow : Color.White;
}

将您的 Elem 数组包装到类对象中以添加“ok”属性。

【讨论】:

    【解决方案2】:

    这真的取决于你想钻进那个兔子洞的深度......

    1. 您需要确定验证状态 - 如果只是是/否的情况,那么 Boolean/bool 就足够了,否则您应该考虑创建一个枚举来保存您的验证状态。

    2. 您需要决定是要扩展需要验证的控件,还是只使用控件的Tag 属性来存储验证状态(个人认为使用Tag 来执行此操作很可怕)。

    一个例子:

    // Provides your validation statuses.
    public enum ControlValidation
    {
        Ok,
        NotOk
    }
    
    // Provides a contract whereby your controls implement a validation property, indicating their status.
    public interface IValidationControl
    {
        ControlValidation ValidationStatus { get; private set; }
    }
    
    // An example of the interface implementation...
    public class TextBox : System.Windows.Forms.TextBox, IValidationControl
    {
        public ControlValidation ValidationStatus { get; private set; }
    
        ...
    
        protected override void OnTextChanged(EventArgs e)
        {
            ValidationStatus = ControlValidation.Ok;
        }
    }
    

    【讨论】:

      【解决方案3】:

      您在 Windows 窗体中有一些有用的工具来执行验证和显示错误消息,包括:

      使用上述选项:

      • 您可以在对模型类使用数据绑定时执行验证。
      • 您可以在不使用数据绑定时执行验证。
      • 您可以在处于无效状态的控件附近显示错误消息和错误图标。
      • 您可以决定阻止无效控件更改焦点或让焦点更改。
      • 您可以显示表单的验证摘要。
      • 也可以申请DataAnnotations Validations in Windows Forms

      IDataErrorInfo 接口

      如果您有一些模型类,最适合在 Windows 窗体中验证和提供错误消息的方法是实现 IDataErrorInfo。它由数据绑定机制和一些 Windows 窗体控件(如 DataGridViewErrorProvider)支持。

      为简单起见,您可以在类中编写验证规则并使用IDataErrorInfo 属性返回错误消息。即使你想应用更高级的场景,比如使用验证引擎,最后最好实现IDataErrorInfo 以获得与寡妇表单的最大一致性。

      您将使用ErrorProvider 来显示错误消息。将其绑定到您的数据源就足够了,它会自动显示错误。

      控件的验证事件

      如果您没有模型类并且所有验证都应针对控件进行,最好的选择是使用控件的Validating 事件。在那里您可以设置e.Cancel = true 将控制状态设置为无效。然后您可以防止焦点更改或使用控制状态来获取验证摘要。

      在这种情况下,您将使用ErrorProvider 来显示错误。以这种方式在Validating 事件中为控件设置错误就足够了:errorProvider1.SetError(control1, "Some Error") 或者您可以设置一个空的错误消息来消除验证错误。

      ErrorProvider 组件
      在这两种情况下,当您使用数据绑定或使用Validating 事件时,如上所述,ErrorProvider 会显示错误图标和带有工具提示的错误图标,该工具提示会在控件附近为您显示错误消息。 (DataGridView 使用自己的机制来显示行和单元格上的错误,而不使用 ErrorProvider。)

      您还可以使用组件的GetError 方法获取表单的验证摘要,该方法返回每个控件的错误消息。

      表单的ValidateChildren方法和Aut​​oValidate属性

      您可以使用ValidateChildren表单或容器控件的方法来检查您的控件是否存在验证错误。

      根据表单AutoValidate属性的值,防止焦点改变或让焦点从无效控件改变。

      【讨论】:

      • 您可能会发现这个sample 很有帮助。
      【解决方案4】:

      所有 winforms 组件都有一个可以使用的“备用”属性:Tag。它是一个object,你可以给它分配任何东西:它不被框架用于任何东西,它对这样的情况很有用。

      如果要概括,您可以派生控件并添加属性,但对于一次性单一属性,Tag 可以完美地工作。

      // OK
      myTextBox.Tag = true;
      // NOK
      myTextBox.Tag = false;
      // Undefined
      myTextBox.Tag = null;
      

      检查:

      if(myTextBox.Tag is bool)
      {
        var isOk = (bool)myTextBox.Tag;     
        if(isOk) 
        {
          // It's OK
        } else {
          // It's NOK
        }
      } else {
        // It's undefined
      }
      

      说了这么多,我使用Tag 来处理简单的事情和简单的逻辑。如果您打算拥有更多属性或者它是一个通用的东西......要么使用其他答案中解释的验证机制,要么派生您的控件:

      public class MyTextBox : System.Windows.Forms.TextBox
      {
        public bool ValidationOK { get; set; }
      }
      

      并将控件更改为MyTextBox(如果您已经拥有它们,请打开designer.cs文件并将System.Windows.Forms.TextBox的所有实例更改为<yourNamespace>.MyTextBox),等等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 2014-04-11
        • 2012-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-24
        相关资源
        最近更新 更多