2009-03-20 8 views
1

Je commence juste à comprendre le concept d'un UserControl.Renvoi d'informations à partir d'un UserControl

J'ai créé un UserControl pour regrouper un certain nombre de contrôles qui étaient dupliqués sur des pages individuelles d'un TabControl.

Certains de ces contrôles sont des champs de texte nécessitant une validation, et lorsque la validation échoue, je dois afficher un message d'erreur. Cependant l'endroit où je veux afficher le message d'erreur est sur la barre d'état sur le formulaire principal. Quelle est la meilleure façon de gérer la validation/l'affichage des erreurs dans cette situation?

+0

Checkout: [Comment valider UserControl?] (Http://izlooite.blogspot.com/2010/07/how-to-validate-user-control.html) –

Répondre

4

Pour gérer la validation effectuez l'une de ces:

  • Valider une méthode dans le contrôle de l'utilisateur
  • Demandez à votre contrôle utilisateur ont une propriété delegate (par exemple ValidationHandler) qui peut gérer la validation (cela vous permettrait d'avoir une classe avec un tas de validateurs à vous pouvez attribuer à vos commandes)

    public delegate void Validator(...)

    public Validator ValidationHandler { get; set; }

  • Demandez à votre contrôle utilisateur génère une demande de validation event (par exemple ValidationRequested)

    public event EventHandler<ValidationEventArgs> ValidationRequested

Aviser le système qu'une erreur est survenue faire un de ces:

  • Utilisez un event que les parties intéressées peuvent souscrire à (par exemple ValidationFailed)

  • Si l'objet qui effectue la validation (via le delegate ou event) est également celui dont vous voulez générer le message d'erreur, il peut déclencher le message d'erreur lui-même.

EDIT:

Puisque vous avez dit que vous validerait l'intérieur de votre commande, le code pour un événement ValidationFailed pourrait ressembler à:

// In your user control 

public class ValidationFailedEventArgs : EventArgs 
{ 
    public ValidationFailedEventArgs(string message) 
    { 
     this.Message = message; 
    } 

    public string Message { get; set; } 
} 

private EventHandler<ValidationFailedEventArgs> _validationFailed; 
public event EventHandler<ValidationFailedEventArgs> ValidationFailed 
{ 
    add { _validationFailed += value; } 
    remove { _validationFailed -= value; } 
} 

protected void OnValidationFailed(ValidationFailedEventArgs e) 
{ 
    if(_validationFailed != null) 
     _validationFailed(this, e); 
} 

private void YourValidator() 
{ 
    if(!valid) 
    { 
     ValidationFailedEventArgs args = 
     new ValidationFailedEventArgs("Your Message"); 
     OnValidationFailed(args); 
    } 
} 

// In your main form: 

userControl.ValidationFailed += 
    new EventHandler<ValidationFailedEventArgs>(userControl_ValidationFailed); 

// ... 
private void userControl_ValidationFailed(object sender, 
              ValidationFailedEventArgs e) 
{ 
    statusBar.Text = e.Message; 
} 
+0

+1 J'aime vraiment cette réponse. Je pense qu'il est un peu impliqué, un lien vers une implémentation/article de référence ou quelque chose serait génial pour que ça marche – eglasius

+0

Je valide depuis l'usercontrol - qui fonctionne très bien. J'ai juste besoin d'obtenir le message d'erreur affiché sur le formulaire principal. Pouvez-vous me diriger dans la bonne direction pour définir un événement et gérer l'abonnement? – phrenetic

+0

Utilisez un événement ValidationFailed, la forme principale peut gérer l'événement –

0

Vous pouvez mettre un validateur sur le contrôle utilisateur lui-même, lancer une exception ou ajouter des accesseurs publics aux champs que vous souhaitez afficher dans le formulaire parent.

+0

@Crhis lever une exception? – eglasius

+0

En effet. Une exception serait un peu ewwwwwwwwww. – Quibblesome

+0

@Quarrelsome non seulement cela, si le contrôle utilisateur valide sur le chargement ou tout autre événement de page, il échouerait effectivement la page entière. -1 – eglasius

0

Effectuez une méthode publique sur votre contrôle utilisateur qui valide son champ et vous pouvez transmettre un paramètre de sortie de chaîne.

donc quelque chose comme

public bool IsValid(out string status) 
{ 
// do validation and set the status message 
} 
1

Si vous faites la Validation dans le UserControl, vous pouvez le faire offrir un événement public ValidationFailed et inclure le message dans EventArgs. Le contrôle parent peut alors s'abonner à l'événement ValidationFailed et mettre à jour la barre d'état.

+0

Pourriez-vous développer cela pour moi? Je suis assez nouveau à C# et je ne suis pas sûr de savoir comment vous feriez cela. Toute aide reçue avec reconnaissance. – phrenetic

+0

@phrenetic voir la mise à jour de Daniel, c'est pareil – eglasius

0

Vous pouvez utiliser des validateurs asp.net dans les contrôles utilisateur, ainsi qu'un résumé de validation sur le formulaire principal et il répertoriera les erreurs pour vous.

Pour un autre type d'utilisation, vous pouvez exposer un événement et faire en sorte que la page contenant le contrôle s'abonne à l'événement et prenne les mesures nécessaires.

Questions connexes