2009-03-20 11 views
2

Prenons le site simple suivant comme exemple:ASP.NET: Comment changer la couleur de fond d'un contrôle qui a échoué à la validation?

<asp:TextBox id="TextBox1" 
runat="server"></asp:TextBox> 
&nbsp; 
<asp:RequiredFieldValidator 
id="RequiredFieldValidator1" runat="server" 
ErrorMessage="Required!" 
ControlToValidate="TextBox1"> 
</asp:RequiredFieldValidator> 

Maintenant, je voudrais que le TextBox1 pour changer son BackColor au jaune quand jamais la validation a échoué. Y a-t-il un moyen simple d'accomplir ceci?

Répondre

5

Page.Validators est un ValidatorCollection. Vous pouvez itérer cette collection en envoyant chaque membre à BaseValidator. Vérifiez BaseValidator.IsValid et obtenez le nom du contrôle à partir de BaseValidator.ControlToValidate. Utilisez this.FindControl (nom du contrôle) pour obtenir une référence au contrôle (cela renvoie un objet Control). Effectuez tout type de vérification et de conversion que vous devez effectuer, puis, si vous pouvez convertir le contrôle en TextBox ou un autre contrôle qui contient la propriété BackColor, lancez-le et définissez BackColor.

Voici une version simplifiée:

private void setInvalidControlsBackColor() 
    { 
     Control c; 
     TextBox t; 
     foreach (BaseValidator v in Page.Validators) 
     { 
      if (!v.IsValid) 
      { 
       c = (Control)this.FindControl(v.ControlToValidate); 
       // check the type, make sure you can cast this... 
       t = (TextBox)c; 
       t.BackColor = Color.Yellow; 
       // or however else you want to handle this... 
      } 
     } 
    } 

La raison pour laquelle je ne mentionnaient pas de code pour les trucs de vérification de type est parce que vous pouvez gérer les différents types de contrôle différemment, etc. De plus, si vous êtes n'utilisant pas les champs ToolTip sur vos validateurs, vous pouvez utiliser ce champ pour stocker des informations supplémentaires (un peu comme la propriété Tag). Cela pourrait être considéré comme une pratique laide, mais il est là pour vous si vous en avez besoin ... peut être utilisé comme un indice de ce qu'il faut faire avec des états valides/invalides.

+0

Ma page comporte des zones de texte ainsi que des listes déroulantes. Lors d'un downcasting depuis Control (vers un TextBox ou une Dropdown) - comment pouvons-nous déterminer de manière dynamique si nous avons besoin de downcast vers un TextBox ou une Dropdown (parce que la validation pourrait avoir échoué pour l'un ou l'autre). – User1

+0

quand est-ce que cette méthode est appelée? Un peu confus à ce sujet ... – bflemi3

+1

@ bflemi3 Cette question et réponse dataient de plus de trois ans, mais je crois que le modèle consiste à appeler Page.Validate() dans le code lorsque l'utilisateur soumet le formulaire, puis après des BaseValidators dans Page.Validators sera défini et vous pouvez appeler ce type de méthode immédiatement après Page.Validate(). Je pense que c'est comme ça que ça fonctionne ... Je n'ai pas fait de programmation ASP.NET depuis environ trois ans maintenant, et je ne sais pas si quelque chose est différent maintenant dans MVC – Rich

1

Une meilleure option serait d'hériter des validateurs système et de créer vos propres validateurs. Vous pouvez remplacer le comportement par défaut pour modifier la couleur d'arrière-plan du champ ControlToValidate. Pour la plupart des contrôles, vous n'avez pas besoin de vérifier le type, vous pouvez simplement définir la valeur du style sur "background-color: yellow".

+0

J'avais pensé à cela, mais je voulais demander si il y avait des solutions alternatives. – vipirtti

Questions connexes