.net - 如何强制验证 Compact Framework 中的表单/控件?

标签 .net winforms compact-framework

有什么方法可以在 .NET CF 中强制进行控件验证吗?在完整的 .NET 中有 Validate() 方法,但 CF 中没有。

我试图在关闭表单时使控件将数据绑定(bind)回模型,但单击主菜单按钮似乎不会从控件中窃取焦点,并且不会触发 Validating 和 Validated 事件。

您知道解决此问题的任何方法吗?

最佳答案

大约一年前,我曾遇到过同样的问题。我在网上找到的所有东西都非常讨厌(即遍历控件并捕获每个控件焦点,从而触发验证事件或一些严重依赖 pinvoke 或反射的解决方案 - 我不完全记得)。

我最终创建了包装器,其中包括用于我的文本框等的 Validate 方法,并保留了该包装器的集合。这样,我可以迭代我的包装器并为每个控件调用验证。

该解决方案运行良好。首先,我尝试了以编程方式捕获每个控件焦点的解决方案,但我遇到了很多问题。在浪费了一些时间尝试改进这个解决方案之后,我决定创建这些包装器,这是一个非常好的决定。

更新

这是它的样子。通知我声明需要验证的控件列表:

private List<TextBoxWithValidation> textBoxesWithValidation;

在构造函数中,我将控件添加到列表中:

TextBoxWithValidation emailTextBoxWithValidation = new TextBoxWithValidation(emailTextBox);
emailTextBoxWithValidation.AddValidationPair(Validator.ValidationType.VALIDATE_NOT_EMPTY, "ValidateNotEmptyEmail");
emailTextBoxWithValidation.AddValidationPair(Validator.ValidationType.VALIDATE_EMAIL, "ValidateEmailEmail");
textBoxesWithValidation.Add(emailTextBoxWithValidation);

然后我就可以验证表单了:

private bool ValidateForm()
{
  foreach (TextBoxWithValidation textBoxWithValidation in textBoxesWithValidation)
  {
    if (!textBoxWithValidation.Validate())
    {
      return false;
    }
  }
  return true;
}

带有验证的文本框如下所示:

class TextBoxWithValidation
{
  class ValidationTypeMessagePair
  {
    public Validator.ValidationType ValidationType { get; set; }
    public string ValidationMessage { get; set; }

    public ValidationTypeMessagePair(Validator.ValidationType validationType, string validationMessage)
    {
      this.ValidationType = validationType;
      this.ValidationMessage = validationMessage;
    }
  }

  private List<ValidationTypeMessagePair> validationPairs;
  private TextBox textBox;

  public TextBoxWithValidation(TextBox textBox)
  {
    this.textBox = textBox;
    this.textBox.DataBindings["Text"].DataSourceUpdateMode = DataSourceUpdateMode.Never;            
    validationPairs = new List<ValidationTypeMessagePair>();
  }

  public void AddValidationPair(Validator.ValidationType validationType, string validationMessage)
  {
    validationPairs.Add(new ValidationTypeMessagePair(validationType, validationMessage));
  }

  public bool Validate()
  {
    foreach (ValidationTypeMessagePair validationPair in validationPairs)
    {
      if (!Validator.Validate(validationPair.ValidationType, textBox, Messages.Localize(validationPair.ValidationMessage))) return false;
    }
    textBox.DataBindings["Text"].WriteValue();
    return true;
  }

  public void ClearValidationStatus()
  {
    textBox.BackColor = System.Drawing.SystemColors.Window;
  }

}

关于.net - 如何强制验证 Compact Framework 中的表单/控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1762017/

相关文章:

.net - 使用 .pdb 文件发布发布版本会导致性能下降吗?

c# - WinForm - TabStop 不工作

asp.net - Microsoft.Data.Edm 与 Microsoft.OData.Edm : what is the difference?

c# - 独特的键值对集合

.net - Web 浏览器组件的一个很好的替代品?

c# - 如何在 Windows 窗体 C# 中同时将两个文件发布到 API

c# - 特定时间运行方法

winforms - Compact Framework 3.5 设置表单父级

c# - 更改 TimeZone 不会反射(reflect) .NET Compact Framework 中时间的更改

.net - 仅根据环境拾取服务器上的 Hangfire 任务(交换槽)