使用Reflection调用控件的Validate()方法

时间:2008-11-06 12:22:55

标签: c# winforms reflection validation

我目前正在编写向导,希望在进入下一页之前对每个页面进行验证。

我想通过在页面上的每个子控件上调用Validate()方法来阻止用户进行操作,并且如果其中任何子控件失败则停止导航。

问题是每个子控件上的Validate()方法都是私有方法,因此我无法直接访问它。任何人都可以给我一些关于如何使用Reflection在TextBox(例如)上从Validate()方法获取结果的建议吗?

非常感谢!

编辑:抱歉 - 应该已经指定,这是Windows Forms,.Net 2.0

3 个答案:

答案 0 :(得分:3)

如果页面恰好是ContainerControl实例,则可以调用ValidateChildren。如果没有,这似乎适用于个人控制:

private void ValidateControl(Control control)
{
  Type type = control.GetType();
  type.InvokeMember("PerformControlValidation", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, control, new object[] { true });
}

答案 1 :(得分:1)

如果您正在谈论asp.net,您可以在控件上设置ValidationGroup属性,然后在您需要验证的组的页面上调用this.Validate("GroupName")

如果您需要验证整个页面,请忘记该组并调用Validate()

答案 2 :(得分:0)

无需反思 - 您想要的是ContainerControl.ValidateChildren()(在您的表单/对话框中调用它)

请注意,ContainerControl.Validate()只会验证最后一个控件是否具有焦点及其祖先:

  

Validate方法验证最后一个未经验证的子控件及其祖先通过但不包括当前容器控件

但是,如果您的父控件不是ContainerControl(Say,Panel),则确实需要反射 - 请参阅NoBugz的答案here