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 :

[C#2]Repeater imbriqués, les ID ne sont pas uniques


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 369
    Par défaut [C#2]Repeater imbriqués, les ID ne sont pas uniques
    Salut à tous

    J'ai un "petit" problème avec des repeaters imbriqués (3 pour être exact)

    Voilà un condensé de mon code (je vais pas vous poster la page entière ^^)
    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
     
    ...
    <asp:Repeater ID="rpt_activite" runat="server">
        <ItemTemplate>
            ...
            <asp:Repeater ID="rpt_indicateur" runat="server">
                <ItemTemplate>
                    ...
                    <asp:Repeater ID="rpt_action" runat="server">
                        <ItemTemplate>
                            <asp:Label ID="lbl_dateReal" runat="server" />
                            ...
                            <asp:TextBox ID="txb_dateReal" runat="server" />
                            ...
                        </ItemTemplate>
                    </asp:Repeater>
                    ...
                </ItemTemplate>
            </asp:Repeater>
            ...
        </ItemTemplate>
    </asp:Repeater>
    ...
    Le problème que j'ai, c'est que les "txb_dateReal" (et les "lbl_dateReal" aussi au passage) générés ont tous le même ID dans la page (contrôlé au niveau du code source), j'ai x fois le même ID . Niveau Javascript c'est pas génial. Déjà niveau validation w3, c'est pas génial non plus, mais la boite dans laquelle je bosse veut "que ca fonctionne avec IE6, pour le reste on verra plus tard" mais bon, j'aime bien faire des trucs propre pour l'utilisateur final (même s'il ne le sait pas ), mais bon, c'est surtout niveau Javascript que ca m'arrange pas car tout ceci est re-rempli en fonction d'un traitement en Callback qui lui, renvoit du javascript exécuté par la page (ma fonction "succesCallback" est uniquement composée de "eval(retour);" )

    Seulement, quand j'envoie mes données, elles sont erronées... vu que j'envoie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "'valeur=' + getElementById('" + txb_dateReal.ClientID + "').value"
    en paramètre à mon Callback (mon paramètre est construit sur le modèle des variables d'URL) or je me retrouve avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'valeur=' + getElementById('txb_dateReal').value
    dans mes paramères avec tous les txb_dateReal qui ont le même ID (à savoir 'txb_dateReal')

    Et quand je revient de mon callback avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getElementById('lbl_dateReal').innerHTML = 'nouvelle valeur';
    je me retrouve avec tous les labels qui ont la valeur du dernier envoi... (mais quand je raffraichit tout va bien)

    En gros : c'est quoi l'astuce pour que les contrôles serveurs qui sont dans les repeater imbriqués aient tous des ID javascript différents ?

  2. #2
    Membre éclairé Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 369
    Par défaut
    J'ai trouvé un truc (certes pas super, mais bon... on va pas en demander trop non plus)

    Dans le ItemCreated du dernier repeater j'ai mis ca

    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
     
    /***************************
     * Génération d'ID uniques *
     * ASP.Net ne le fais pas  *
     * pour les repeater       *
     * inbriqués               *
     ***************************/
     
    RepeaterItem parent_1 = ((RepeaterItem)((Repeater)sender).Parent);
    int parent_2 = ((DataRowView)parent_1.DataItem).Row.Table.GetHashCode();
     
    txb_editDateReal.ID += "_" + e.Item.ItemIndex + "_" + parent_1.ItemIndex + "_" + parent_2.ToString();
    txb_editReal.ID += "_" + e.Item.ItemIndex + "_" + parent_1.ItemIndex + "_" + parent_2.ToString();
     
    lbl_dateReal.ID += "_" + e.Item.ItemIndex + "_" + parent_1.ItemIndex + "_" + parent_2.ToString();
    lbl_real.ID += "_" + e.Item.ItemIndex + "_" + parent_1.ItemIndex + "_" + parent_2.ToString();
     
    /****************************
     * /Génération d'ID uniques *
     ****************************/
    Pourquoi avoir pris le HashCode de la source du repeater d'au dessus ? Parce que j'ai pas trouvé comment retrouver le repeater associé à un RepeaterItem et que j'espère qu'il est unique pour chaque table (je pense qu'il doit être unique en fonction du contenu de la table, enfin j'espère)

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut
    C'est vraiment bizarre ton problème.

    J'ai déjà fais des repeater imbriqué sans problème. etant donné que quand les Id sont généré il increment par rapport a l'item ou tu es.

    exemple d'un Id d'un LinkButton dans des repeaters imbriqué:

    _ctl0_productContent_Repeater1__ctl3_Repeater2__ctl0_DeleteLink

    comment tu bind tes repeaters?

    Je te conseil très vivement de pas changer toi même les Id sauf si tu as vraiment pas le choix et que tu sais ce que tu fais .

  4. #4
    Membre éclairé Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 369
    Par défaut
    Pour mes repeater je fais comme ca

    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
    25
    26
    27
     
    protected void load()
    {
        DataTable tbl_repeater1 = new DataTable();
        // Création et remplissage du DataTable
     
        rpt_repeater1.DataSource = tbl_repeater1;
        rpt_repeater1.DataBind();
    }
     
    protected void rpt_repeater1_ItemCreated(object sender, RepeaterItemEventArgs e)
    {
        DataTable tbl_repeater2 = new DataTable();
        // Création et remplissage du DataTable
     
        rpt_repeater2.DataSource = tbl_repeater2;
        rpt_repeater2.DataBind();
    }
     
    protected void rpt_repeater2_ItemCreated(object sender, RepeaterItemEventArgs e)
    {
        DataTable tbl_repeater3 = new DataTable();
        // Création et remplissage du DataTable
     
        rpt_repeater3.DataSource = tbl_repeater3;
        rpt_repeater3.DataBind();
    }
    Il y a quelques commandes supplémentaires spécifiques à chaque repeater, mais il ne s'agit que de rapatrier des données pour les mettre dans le DataTable ou d'initialiser les propriétés de quelques éléments (genre le texte ou le onchange d'un TextBox)

    EDIT : Pour changer les ID, c'est pas super grave, vu que la page n'est chargée qu'une fois, aucun PostBack possible (en fait le seul PostBack potentiellement déclenché réalise un Redirect sur une page de perte de session, ou un Redirect sur une autre page)

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut
    Etant donné que tu as 'n' repeater, tous est dynamique.

    Tu devrais utilise la methode FindControl de ton item courant pour recuperer ton repeater.



    Je te conseillerais de te mettre sur le OnItemDataBound. Car ItemCreated arrive quand l'item est deja créé. Mais bon ca c'est que un détail ton problème dois plus venir du findControl.

    ex:
    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
    protected void _firstRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
            {
     Repeater currentRepeater = (Repeater)e.Item.FindControl("_repeater2 ");
    currentRepeater.ItemDataBound += new RepeaterItemEventHandler(_repeater2_ItemDataBound);
    currentRepeater.DataSource = source;
    currentRepeater.DataBind():
    }
     
    protected void _repeater2_ItemDataBound(object sender, RepeaterItemEventArgs e))
    {
       Repeater _repeater2 = (Repeater)e.Item.FindControl("_repeater3");
    _repeater2.ItemDataBound += new RepeaterItemEventHandler(_repeater3_ItemDataBound);
    _repeater2.DataSource = source;
    _repeater2.DataBind():
    }
    J'ai fais ce code de tête donc je te garantis pas qu'il marche direct ; Mais les grandes lignes sont la.

    Tiens moi au courant.

  6. #6
    Membre éclairé Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 369
    Par défaut
    Oui, en fait je fais déjà comme ca (obligé de toute facon, vu que les repeaters sont instanciés au fur et à mesure que les items sont créés (j'avais oublié de le préciser )) SAUF pour le EventHandler qui est défini dans la balise du fichier .aspx

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/12/2006, 17h53
  2. Les limites ne sont pas prises en compte
    Par Atamix dans le forum Requêtes
    Réponses: 2
    Dernier message: 09/12/2006, 12h41
  3. [SQL] Les variables ne sont pas UPDATEES
    Par guillaumeIOB dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 29/09/2006, 17h30
  4. Réponses: 1
    Dernier message: 04/12/2005, 18h02
  5. Les Langages ne sont pas tous les mêmes ......
    Par Max Payne dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 28/08/2003, 13h51

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