2008-11-06 4 views
2

Je suis actuellement en train d'écrire un assistant et je souhaite que chaque page soit validée avant de passer à la page suivante.Appel de la méthode Validate() d'un contrôle à l'aide de Reflection

Je veux empêcher l'utilisateur de progresser en appelant la méthode Validate() sur chaque contrôle enfant de la page et en arrêtant la navigation si l'un d'entre eux échoue.

Le problème est que la méthode Validate() sur chaque contrôle enfant est une méthode privée, donc je ne peux pas y accéder directement. Quelqu'un peut-il me donner quelques conseils sur comment obtenir un résultat de la méthode Validate() sur un TextBox (par exemple) en utilisant Reflection?

Merci beaucoup!

Edit: Désolé - aurait dû préciser, cela est Windows Forms, .Net 2.0

+0

Êtes-vous sur Windows Forms ou ASP.Net? –

Répondre

1

Si vous parlez asp.net, vous pouvez définir l'attribut ValidationGroup sur le contrôle puis appelez this.Validate("GroupName") sur la page pour la groupe que vous devez valider. Oubliez le groupe et appelez Validate() si vous avez besoin de valider la page entière.

3

Si les pages sont des instances de ContainerControl, vous pouvez simplement appeler ValidateChildren. Dans le cas contraire, cela semble fonctionner sur un contrôle individuel:

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

Pas besoin de réflexion - ce que vous voulez est ContainerControl.ValidateChildren() (appelons-le sur votre formulaire/dialogue)

Notez que ContainerControl.Validate() ne validera la dernière le contrôle focus et ses ancêtres:

la méthode valide Valider le dernier contrôle enfant non validée et ses ancêtres à travers, mais ne comprenant pas, le conteneur actuel contrôle

Cependant, si votre contrôle parent est pas un ContainerControl (Say, un groupe spécial), la réflexion est en effet nécessaire - voir la réponse nobugz here

Questions connexes