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

ASP.NET Discussion :

[VB.Net] ajouter un eventhandler a une dropdownlist


Sujet :

ASP.NET

  1. #1
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Points : 1 022
    Points
    1 022
    Par défaut [VB.Net] ajouter un eventhandler a une dropdownlist
    Bonjour,
    J'ai une colonne template dans mon datagrid qui contient un control dropdownlist.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For Each dgi As DataGridItem In GridView2.Items
         AddHandler CType(dgi.FindControl("queries"), 
       DropDownList).SelectedIndexChanged, AddressOf somefunction
    Next
    le AddHandler ne pose pas de probleme a la compilation. Mais pourtant la fonction somefunction n'est jamais appellée, je ne comprends pas pourquoi. Voici sa définition:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub somefunction(ByVal sender As Object, ByVal e As System.EventArgs)
            MsgBox("test")
    End Sub
    Pouvez vous m'aider ?
    merci

  2. #2
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Points : 1 022
    Points
    1 022
    Par défaut
    Personne n'a une idée pour ca :

  3. #3
    Membre expert
    Avatar de FremyCompany
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Points : 3 289
    Points
    3 289
    Par défaut ??
    Tu es sur que ASP .Net ne renomme pas ton contrôle "querries" en un truc du genre "DataGrid1_querries" ?

    Si non, il te reste une possibilité moins "conventionnelle" :
    Ajouter un attribut JS onchange (?) à ta dropdownlist qui lance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    __dopostback("querries_event_button","")
    où querries_event_button est un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <asp:button id="querries_event_button" visible="false" onclick="nom de ta fonction" />
    PS : Fait attention, j'ai codé à la va vite, et tu devras surement chercher un peu pour faire fonctionner mon code

    Fremy
    Fremy
    Pour vos développements Web et une navigation agréable, le tout gratuit :
    1) IE 8 + IE7Pro (Si vous ne connaissez pas IE7Pro, essayez !)
    2) FF 3 + Web Developper Toolbar + AdBlockPlus + FireBug + GreaseMonkey

  4. #4
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Points : 1 022
    Points
    1 022
    Par défaut

    J'hallucine, ce con l'a effectivement renommé en :
    ctl00_ReportWizard_GridView2_ctl03_queries
    Heu... je fais koi la ?
    ps: pas question d'utiliser du javascript

  5. #5
    Membre expert
    Avatar de FremyCompany
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Points : 3 289
    Points
    3 289
    Par défaut __dopostback()
    __dopostback() est la methode asp .net crée automatiquement pour la gestion d'évenement (exepté les bouttons qui ont un traitement particulier)... si un navigateur n'accepte pas JS, adieu les page ASP .net donc.

    Utiliser __dopostback() est donc la seule possiblité que j'envisage...

    néamoins tu peux aussi envisager drowdownlist1.ClientID mais dans ton cas, je doute que ce soit possible...

    PS : le boutton relai doit posséder UseSubmitBehavior="false"
    Fremy
    Pour vos développements Web et une navigation agréable, le tout gratuit :
    1) IE 8 + IE7Pro (Si vous ne connaissez pas IE7Pro, essayez !)
    2) FF 3 + Web Developper Toolbar + AdBlockPlus + FireBug + GreaseMonkey

  6. #6
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Points : 1 022
    Points
    1 022
    Par défaut
    Bon certes. Mais cela n'explique pas pourquoi mon control a été renommé. Je préfererais qu'il ne soit pas renommé et que ca marche en utilisant AddHandler qui est largement plus simple syntaxiquement. Le coup d'utiliser un bouton invisible c'est un peu du systemD je trouve

  7. #7
    Membre expert
    Avatar de FremyCompany
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Points : 3 289
    Points
    3 289
    Par défaut Complément d'informations
    __dopostback demande 2 arguments

    1)Le clientID de l'objet qui lance l'évenement.
    Tu peux l'obtenir grace à :2)Les argument de l'action
    Click n'en admet aucun ==> '' ou ""

    3)l'ID correspont à "sender" et les arguments à "e".

    4)Je me suis trompé, le boutton relai doit avoir visible="true"
    Utilise à la place style="display: none; visibility: hidden"
    Fremy
    Pour vos développements Web et une navigation agréable, le tout gratuit :
    1) IE 8 + IE7Pro (Si vous ne connaissez pas IE7Pro, essayez !)
    2) FF 3 + Web Developper Toolbar + AdBlockPlus + FireBug + GreaseMonkey

  8. #8
    Membre expert
    Avatar de FremyCompany
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Points : 3 289
    Points
    3 289
    Par défaut Pourquoi est-il renommé ?
    Pourquoi est-il renommé ?

    Quelle longue histoire...

    En regardant le nom "client", je remarque que tu utilise une page maitre.
    D'ou le "ctl100_" devant

    Ensuite, voici la raison.
    Je crée un usercontrol.
    Dedans je met un champs chaché nommé "MyName"

    Dans une page, je mets 2 fois ce usercontrol
    ==> 2 fois le même id ==> problème
    ASP .net renome donc AUTOMATIQUEMENT le controle en "Usercontrol1_MyName"

    PS : J'avoue que ma solution est un peu "bricolée", mais je t'assure, ca marche du tonnerre !

    Fremy
    Fremy
    Pour vos développements Web et une navigation agréable, le tout gratuit :
    1) IE 8 + IE7Pro (Si vous ne connaissez pas IE7Pro, essayez !)
    2) FF 3 + Web Developper Toolbar + AdBlockPlus + FireBug + GreaseMonkey

  9. #9
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Points : 1 022
    Points
    1 022
    Par défaut
    Certes, mais dans ton cas tu utilises un usercontrol que tu appelles deux fois avec le meme id. Moi j'ai une Content Page qui est liée a une Master Page. La content Page contient plusieurs controls avec un Id unique.
    Donc je m'interroge toujours, pourquoi at-il besoin de renommer mes controls???

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Il ne faut pas confondre l'id coté client de ton controle et l'id coté serveur. Asp.net est obligé de "renommer" tes id coté serveur, simplement pour garantir l'unicité de ces id coté client justement, pour le cas ou par exemple tu déposes plusieurs mêmes user controles dans une seule page. Tu vois le truc ?

    Par contre coté serveur dans ton user control ou ta page tu n'as pas à te soucier de ça, ça doit rester transparent pour toi et tu dois généralement (sauf cas tarabiscoté) simplement utiliser tes id coté serveur. D'ailleurs s'il n'arrivait pas à trouver ton controle le dgi.FindControl te renverrait null et tu aurais droit à une belle NullReferenceException. Le probleme ne vient donc pas de là.

    Ensuite il faut forcemment ajouter tes event handler à chaque postback de ta page, est ce que c'est bien fait ? Dernier point si tu veux que le postback soit déclenché qd on change la selection d'une drop down list, il ne faut pas oublier de mettre leurs propriétés AutoPostBack à true (mais ce n'est peut etre pas ce que tu souhaites).

  11. #11
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Points : 1 022
    Points
    1 022
    Par défaut
    Citation Envoyé par Sphax
    Il ne faut pas confondre l'id coté client de ton controle et l'id coté serveur. Asp.net est obligé de "renommer" tes id coté serveur, simplement pour garantir l'unicité de ces id coté client justement, pour le cas ou par exemple tu déposes plusieurs mêmes user controles dans une seule page. Tu vois le truc ?
    Oui je vois le truc.

    Par contre coté serveur dans ton user control ou ta page tu n'as pas à te soucier de ça, ça doit rester transparent pour toi et tu dois généralement (sauf cas tarabiscoté) simplement utiliser tes id coté serveur. D'ailleurs s'il n'arrivait pas à trouver ton controle le dgi.FindControl te renverrait null et tu aurais droit à une belle NullReferenceException. Le probleme ne vient donc pas de là.
    J'ai déjà rencontré ce probleme. Et donc là j'utilise bien le ID et pas le ClientId, donc ca devrait marcher. Alors en effet j'aurais tendance a penser comme toi, que le probleme ne vient pas de la finalement.
    Ensuite il faut forcemment ajouter tes event handler à chaque postback de ta page, est ce que c'est bien fait ? Dernier point si tu veux que le postback soit déclanché qd on change la selection d'une drop down list, il ne faut pas oublier de mettre leurs propriétés AutoPostBack à true (mais ce n'est peut etre pas ce que tu souhaites).
    les event handler sont bien ajoutés a chaque postback, et non je ne veux pas avoir AutoPostBack a True.
    Je patauge.

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Ils sont bien remis dans le page load, pas aprés ?

  13. #13
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Points : 1 022
    Points
    1 022
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            GetQueries()
     End Sub
    et

    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
    17
    18
    19
    20
    21
    22
    23
    24
    Private Sub GetQueries()
      Dim da As New DatabaseAccess
     
       Try
        'bind grid of query groups
         GridView2.DataSource = ds.Tables(1)
         GridView2.DataBind()
     
         For Each dgi As DataGridItem In GridView2.Items
            'bind dropdownlist control to correct datatable
             CType(dgi.FindControl("GroupQueries"), DropDownList).DataSource = arr.Item(dgi.ItemIndex)
     
             CType(dgi.FindControl("GroupQueries"), DropDownList).DataValueField = "QueryId"
             CType(dgi.FindControl("GroupQueries"), DropDownList).DataTextField = "QueryName"
     
             AddHandler CType(dgi.FindControl("GroupQueries"), DropDownList).SelectedIndexChanged, AddressOf somefunction
     
            CType(dgi.FindControl("GroupQueries"), DropDownList).DataBind()
         Next
     
        Catch ex As Exception
              MsgBox(ex.Message.ToString)
        End Try
     End Sub
    Convaincu ?

  14. #14
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Ah oui non mais d'accord, il ne faut pas rebinder tes drop down list à chaque post back, sinon comment veux tu qu'asp.net te dise que la selection a changée ?? Je te rappel qu'il génere les evenements aprés le page_load, mais toi aprés le page_load tu as réinitialisé les drop down, asp.net en déduit qu'il n'y a eu aucun changement... Tu bind une seule fois, tu ajoutes tes handlers à chaque postback .

  15. #15
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Points : 1 022
    Points
    1 022
    Par défaut
    OK, j'ai fais un sample, et il faut utiliser AutoPostBack, sinon ca fonctionne pas. Je vais essayer dans mon code maintenant (un peu plus délicat)
    a suivre...

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Arf je sens une assez grande confusion dans tes propos. Donc :

    Tes évenements sont des evenements coté serveur. Pour qu'ils se declenchent il faut un postback à un moment ou un autre. Que ce postBack soit déclenché par tes drop down list ou bien par un bouton ou n'importe quel autre controle ne change rien.

    Au moment du post back, ton page_load est appelé (enfin ya d'autres evenemtns avant mais ils ne nous interessent pas) puis les evenements sur tes controles sont appelés. Pour générer un evenement SelectedIndexChanged d'un drop down asp.net se base sur la valeur du controle avant le postback (dans le viewstate) qu'il compare à la valeur courante. Si ya changement, ya évenement.
    Toi pendant le page_load tu t'amuses à réinitialiser tes drop down list. Donc pour asp.net il n'y a pas de différence entre les valeurs du viewstate et les valeurs courantes (reinitialisée donc) de tes controles, donc pas d'evenement généré... Tu me suis ?

    EDIT : depuis le début j'ecris déclAncher , et il me semble bien que c'est plutot déclEncher. si qqun pouvait me confirmer ma faute, je corrigerais partout .

    EDIT 2 : corrigé, merci

  17. #17
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Points : 1 022
    Points
    1 022
    Par défaut
    oui, c'est bien déclEncher, je sens une grande confusion dans tes propos, lol.
    Plus sérieusement merci du coup de pouce, j'avais pas bien compris comment tout cela marchait. Je viens du winform et c'est plus compliqué en asp.net je trouve.

    Donc effectivement je dois utiliser AutoPostBack. Et je dois tester IsPostBack pour ne pas refaire le Binding. Par contre j'ajoute l'eventhandler dans tous les cas. Ais-je bien compris la leçon monsieur ?

  18. #18
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Leçon bien comprise (désolé si j'ai paru un peu moralisateur )

    Effectivement en web c'est plus compliqué qu'en winform à cause de la distinction coté client / coté serveur. C'est aussi plus limité, moins joli, moins réactif etc... bref bienvenu dans le monde des applications web .

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

Discussions similaires

  1. ajout d'item dans une dropdownlist ajax
    Par fguigui dans le forum ASP.NET Ajax
    Réponses: 0
    Dernier message: 22/07/2010, 23h35
  2. Réponses: 8
    Dernier message: 20/05/2008, 18h02
  3. ajouter un item a une dropdownlist
    Par zaineb.z dans le forum ASP.NET
    Réponses: 2
    Dernier message: 05/05/2008, 10h47
  4. VB.net Ajout de caractere dans une textbox
    Par TIREUR dans le forum Windows Forms
    Réponses: 1
    Dernier message: 14/06/2006, 20h16
  5. Réponses: 5
    Dernier message: 08/02/2005, 13h05

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