我目前正在编写向导,希望在进入下一页之前对每个页面进行验证。
我想通过在页面上的每个子控件上调用Validate()方法,并在其中任何一个失败时停止导航,来防止用户继续前进。
问题是每个子控件上的Validate()方法都是私有方法,所以我不能直接访问它。有人能给我一些关于如何使用反射从TextBox(例如)上的Validate()方法获得结果的建议吗?
非常感谢!
编辑:对不起-应该指定,这是Windows Forms,.Net 2.0
如果页面恰好是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 });
}
如果您使用的是asp.net,您可以在控件上设置ValidationGroup属性,然后在需要验证的组的页面上调用this.Validate("GroupName")
。
如果需要验证整个页面,请忘记该组,只需调用Validate()
即可。
无需反射-您想要的是ContainerControl.ValideChildren()(在表单/对话框中调用它)
注意ContainerControl.Valide()只会验证最后一个具有焦点的控件及其祖先:
Validate方法通过但不包括当前容器控件来验证最后一个未验证的子控件及其祖先
但是,如果您的父控件不是ContainerControl(例如,一个Panel),则反射确实是必要的-请参阅NoBugz在此处的回答