如何在Compact Framework中强制验证表单/控件?

时间:2009-11-19 09:32:07

标签: .net winforms compact-framework

有没有办法在.NET CF中强制进行控制验证?在完整的.NET中有Validate()方法,但CF中缺少它。

我正在尝试在关闭表单时将控件绑定数据返回到模型,但是单击主菜单按钮似乎没有从控件中窃取焦点,并且验证和验证事件不会触发。 / p>

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

3 个答案:

答案 0 :(得分:3)

一年前我在同样的问题上挣扎。我在网上发现的一切都非常讨厌(即迭代控件并捕获每个控件焦点,从而触发验证事件或一些严重依赖于pinvoke或反射的解决方案 - 我不记得了。)

我最终创建了包含我的文本框等的Validate方法的包装器,并保留了这个包装器的集合。这样,我可以迭代我的包装器并为每个控件调用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;
  }

}

答案 1 :(得分:0)

如果有人发现它有用,我将描述我已应用的解决方法。

在OK处理程序中,我添加了代码,这些代码集中在包含我想要验证的控件的Panel上。当数据编辑控件失去焦点时,它会触发Validating和Validated事件并将数据绑定回模型类。这样,表单(对于'向导'的许多部分来说是通用的,并且只知道加载了屏幕的面板)可以强制验证控件。

有点黑客,但它现在会做。

答案 2 :(得分:0)

我认为,为了通过关注其他控件来触发Validating和Validated事件,您需要将Form AutoValidate属性设置为AutoValidate.EnableAllowFocusChange。

希望它有所帮助。 =]