IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Web avec .NET Discussion :

Validator sur CheckBoxList


Sujet :

Développement Web avec .NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut Validator sur CheckBoxList
    Bonjour tout le monde

    J'ai un bug de développement qui me laisse perplexe : le contrôle CustomValidator ne marche pas sur un CheckBoxList.

    Alors voilà, je voudrais faire un contrôle sur le nombre de case cochées dans un CheckBoxList. Pour cela je me suis dit qu'un CustomValidator serait la bonne solution. Je compte le nombre de case et je test pour savoir si j'en ai le bon nombre. Facile, à priori.

    Donc j'ai mis ça côté HTML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <asp:CheckBoxList ID="cblCentreInteret" runat="server" RepeatDirection="Horizontal" RepeatLayout="Table" RepeatColumns="3" Width="100%"></asp:CheckBoxList>
     
    <asp:CustomValidator ID="cvCentreInteret" runat="server" ControlToValidate="cblCentreInteret"></asp:CustomValidator>
    Et là, sans aller dans le CodeBehind (enfin, si, j'ai juste défini le ErrorMessage) il me dit :
    Le contrôle 'cblCentreInteret' référencé par la propriété ControlToValidate de 'cvCentreInteret' ne peut pas être validé.
    Sans plus d'explication.

    J'ai repris la MSDN et j'ai rien de trouvé de particulier dedans.
    Vous y comprennez quelque chose ?

  2. #2
    Membre Expert
    Avatar de Nicolas Esprit
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2010
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 1 467
    Par défaut
    Bonjour,

    Soit c'est un oubli, soit tu ne l'as pas copié lors de la rédaction de ton post, mais en tout cas je ne vois pas la property OnServerValidate="ServerValidation" de ton CustomValidator.

    Du coup il faudrait aussi poster le code de ta méthode du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     void ServerValidation(object source, ServerValidateEventArgs args)
    En espérant t'avoir aidé.

    [EDIT] Sinon pour faire plus simple, tu peux regarder le billet de Cyril Durand intitulé CheckBoxList et Validation : imposer qu'au moins une checkbox soit coché qui te donne un exemple[/EDIT]

  3. #3
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Merci Nicolas pour ton aide.

    Non, ce n'est pas un oubli, c'est automatique. C'est un évènement du CustomValidator.

    J'ai un autre CustomValidator dans ma page, sur un autre contrôle et j'ai pas eu besoins de lui spécifier le truc. Dans le CodeBehind, j'ai pris l'évènement ServerValidate du CustomValidator et j'ai programmé mon contrôle, tout simplement et ça marche bien.

    Par acquis de conscience j'ai spécifié comme tu me l'indique, mais cela ne change rien.
    Voici mon code actuel :
    côté HTML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <asp:CheckBoxList ID="cblCentreInteret" runat="server" RepeatDirection="Horizontal" RepeatLayout="Table" RepeatColumns="3" Width="100%"></asp:CheckBoxList>
    <asp:CustomValidator ID="cvCentreInteret" runat="server" ControlToValidate="cblCentreInteret" OnServerValidate="cvCentreInteret_ServerValidate"></asp:CustomValidator>
    et mon CodeBehind
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Protected Sub cvCentreInteret_ServerValidate(ByVal source As Object, ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles cvCentreInteret.ServerValidate
            Dim i As Int16 = 0
            For Each ci As ListItem In cblCentreInteret.Items
                If ci.Selected Then
                    i += 1
                End If
            Next
            If i > 4 Then
                args.IsValid = True
            Else
                args.IsValid = False
            End If
        End Sub
    Rien de bien transcendantal en somme.

    Pour l'exemple voici le code de mon autre CustomValidator
    Côté HTML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <asp:TextBox ID="txtDateNaissance" runat="server"></asp:TextBox>
    <asp:CustomValidator ID="cvDateNaissance" runat="server"></asp:CustomValidator>
    et CodeBehind
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     Protected Sub cvDateNaissance_ServerValidate(ByVal source As Object, ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles cvDateNaissance.ServerValidate
            Dim frFR As New CultureInfo("fr-FR")
            Dim testdate As DateTime
     
            If DateTime.TryParseExact(args.Value, "dd/mm/yyyy", frFR, DateTimeStyles.None, testdate) Then
     
                If GetAge(args.Value) < 18 Or GetAge(args.Value) > 99 Then
                    args.IsValid = False
                Else
                    args.IsValid = True
                End If
            Else
                args.IsValid = False
            End If
     
        End Sub
    Et celui là marche trés bien (encore merci à Tomlev pour son aide sur la fonction GetAge)

    Vois tu ce que je veux dire ?

  4. #4
    Membre Expert
    Avatar de Nicolas Esprit
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2010
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 1 467
    Par défaut
    Ok, je vois mieux le truc.

    A tout hasard, peux-tu tester en enlevant de ton CustomValidator la property ControlToValidate ?

    Tu aurais ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <asp:CheckBoxList ID="cblCentreInteret" runat="server" RepeatDirection="Horizontal" RepeatLayout="Table" RepeatColumns="3" Width="100%"></asp:CheckBoxList>
    <asp:CustomValidator ID="cvCentreInteret" runat="server" OnServerValidate="cvCentreInteret_ServerValidate"></asp:CustomValidator>

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    A mon avis tu ne peux pas utiliser un validator sur un CheckBoxList, parce qu'il n'a pas l'attribut ValidationProperty...

    Citation Envoyé par MSDN
    For an input control to be validated, the System.Web.UI.ValidationPropertyAttribute attribute must be applied to the control

  6. #6
    Membre Expert
    Avatar de Nicolas Esprit
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2010
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 1 467
    Par défaut
    Oui j'ai vu ça aussi. Le fait de ne pas avoir de ValidationPropertyAttribute, fait qu'on ne peut utiliser ControlToValidate. D'où mon post précédent.

    Sinon on peut peut-être contourner cela comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [ValidationProperty("SelectedIndex")]
    public class CheckBoxList : System.Web.UI.WebControls.CheckBoxList
    {
    }
    et dans le Web.config :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <tagMapping>
      <add tagType="System.Web.UI.WebControls.CheckBoxList, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" mappedTagType="Namespace.CheckBoxList, Assembly"/>
    </tagMapping>
    A défaut, il y a la solution de Scott Mitchell qui fonctionnera très bien. Cf cet article.

    En espérant t'avoir aidé.

  7. #7
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    @Nicolas : je n'ai plus d'erreur mais je n'ai pas de contrôle. Lorsque je clique sur le formulaire à vide, il me mets tous mes messages d'erreur attendus sauf celui qui devrait me dire de choisir des centres d'interêt.


    @Tomlev : outre le billet dont Nicolas nous parle sur le Blog de Cyril Durand j'ai aussi trouvé ça http://forums.asp.net/t/1363788.aspx qui fait un contrôle sur un CheckBoxList.
    Alors moi je veux bien le truc de la MSDN, mais doit y avoir un souci quelque part.

    Une autre idée ?

  8. #8
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    @Nicolas : j'ai posté en même temps que toi, du coup, je reprends ton message avec le lien de Scott Mitchell.

    D'abords je trouve ça, vachement compliqué, mais bon, s'il faut en passer par là. J'ai commencé par traduire le C# en VB avec mon traducteur en ligne.

    J'ai deux soucis (vu que je suis pas trés doué).
    Le premier se passe dans le code de la Sub : il y a une ligne qui fait comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Return (_listctrl <> Nothing)
    Et là il me dit :
    L'opérateur '<>' n'est pas défini pour les types 'System.Web.UI.WebControls.ListControl' et 'System.Web.UI.WebControls.ListControl'
    J'ai essayé un "Is Not Nothing", mais ça marche pas mieux.

    Deuxième souci : là on touche à un truc que je ne maitrise pas. Dans mon composant j'ai mis le tag qui va bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <%@ Register TagPrefix="CustomValidators" Namespace="CustomValidators" Assembly="filename_of_DLL_file" %>
    Je ne sais pas ce qu'il faut que je mette dans l'attribut Assembly sacant que la Class et le Namespace sont placé dans le fichier de CodeBehind de mon composant.

    A part ça, je pense que ça doit aller sauf que j'ai aps bien compris ce que fais la nouvelle Class comme contrôle. Si je décrypte bien elle vérifie qu'on a cohé une case, moi j'en voudrais 5, mais surtout, si je dois passer par ce genre de chose, je voudrais pouvoir spécifier, sous forme de propriété ou d'attribut le nombre de case mini à cocher.

    Au surplus, je voudrais que se soit accessible sur l'ensemble de mon site, donc je pense qu'il faudrait que je mette le Tag Prefix dans mon web.config, mais je ne sais pas trop faire ça.

    Merci les gars.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB NET2002] Créer un setup valide sur tout type de machine ?
    Par magic8392 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 02/05/2006, 16h41
  2. [VB NET2002] Créer un setup valide sur tout type de machine ?
    Par magic8392 dans le forum Installation, Déploiement et Sécurité
    Réponses: 5
    Dernier message: 29/04/2006, 09h44
  3. Réponses: 3
    Dernier message: 09/04/2006, 09h10
  4. [JDBC] Opération non valide sur un ensemble
    Par marti dans le forum JDBC
    Réponses: 2
    Dernier message: 13/10/2005, 19h17
  5. [Exception]Lors d'un validate sur un jframe
    Par cameleon2002 dans le forum Agents de placement/Fenêtres
    Réponses: 12
    Dernier message: 02/05/2005, 11h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo