【问题标题】:Programmatically invoking validation on a TextBox以编程方式在 TextBox 上调用验证
【发布时间】:2011-12-07 23:45:07
【问题描述】:

我正在编写单元测试来测试在 GUI 中键入的数据是否经过验证和正确记录。目前我正在使用这样的代码:

using (MyControl target = new MyControl())
{
    PrivateObject accessor = new PrivateObject(target);
    TextBox inputTextBox = (TextBox)accessor.GetField("InputTextBox");
    string expected, actual;

    expected = "Valid input text.";
    inputTextBox.Text = expected;
    // InputTextBox.TextChanged sets FieldData.Input
    actual = target.FieldData.Input;
    Assert.AreEqual(expected, actual);
}

但我宁愿使用 Validated 事件而不是 TextChanged 事件。

using (MyControl target = new MyControl())
{
    PrivateObject accessor = new PrivateObject(target);
    TextBox inputTextBox = (TextBox)accessor.GetField("InputTextBox");
    string expected, actual;
    bool valid;

    expected = "Valid input text.";
    inputTextBox.Text = expected;
    valid = inputTextBox.Validate();
    // InputTextBox.Validating returns e.Cancel = true/false
    // InputTextBox.Validated sets FieldData.Input
    Assert.IsTrue(valid);
    actual = target.FieldData.Input;
    Assert.AreEqual(expected, actual);
}

如何在文本框或任何其他支持 Validated 事件的控件上调用验证?我应该写什么来代替inputTextBox.Validate()?我对 C# 和 VB.Net 很熟悉。

【问题讨论】:

    标签: .net winforms validation invoke


    【解决方案1】:

    我不确定我是否在这里遗漏了什么,但这种扩展方法似乎有效:

    private static readonly MethodInfo onValidating = typeof(Control).GetMethod("OnValidating", BindingFlags.Instance | BindingFlags.NonPublic);
    private static readonly MethodInfo onValidated  = typeof(Control).GetMethod("OnValidated" , BindingFlags.Instance | BindingFlags.NonPublic);
    public static bool Validate(this Control control)
    {
        CancelEventArgs e = new CancelEventArgs();
        onValidating.Invoke(control, new object[] { e });
        if (e.Cancel) return false;
        onValidated.Invoke(control, new object[] { EventArgs.Empty });
        return true;
    }
    

    并且被调用:

    valid = inputTextBox.Validate();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-05
      • 2019-06-04
      相关资源
      最近更新 更多