验证用户输入/授予.NET控件状态OK或NOK

时间:2016-03-14 13:23:13

标签: c# .net winforms

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

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

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

我很确定必须有另一种方式!我想要做的是使用名为status或类似的OK或NOK属性扩展这些.NET控件。你能做到吗?如果是这样,你怎么做?是这样的吗?

感谢您的回复!

4 个答案:

答案 0 :(得分:5)

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

使用以上选项:

  • 您可以在使用数据绑定到模型类时执行验证。
  • 当您不使用数据绑定时,您可以执行验证。
  • 您可以在处于无效状态的控件附近显示错误消息和错误图标。
  • 您可以决定阻止无效控件的焦点更改或让焦点发生变化。
  • 您可以显示表单的验证摘要。

IDataErrorInfo接口

如果您有一些模型类,最适合验证并在Windows窗体中提供错误消息正在实现IDataErrorInfo。它受数据绑定机制的支持,并且某些窗口控件如DataGridViewErrorProvider

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

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

验证控制事件

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

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

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

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

ValidateChildren方法和表单的AutoValidate属性

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

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

答案 1 :(得分:0)

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

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 :(得分:0)

这真的取决于你想深入挖掘兔子洞的深度......

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

  2. 您需要决定是否要扩展需要验证的控件,或者只使用控件的Tag属性来存储验证状态(我个人认为使用Tag这是可怕的。)

  3. 示例:

    // 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 :(得分:0)

所有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)等。