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

  1. #1
    Membre éclairé Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    367
    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 : 367
    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
    367
    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 : 367
    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
    367
    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 : 367
    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
    367
    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 : 367
    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

  7. #7
    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
    alors la je suis un peu perdu. Après l'avoir fais sans soucis c'est bizarre ton probléme d'id.

    il n'y a pas de raisons qu'il mettent les mêmes. pour chaque item d'un repeater on a un nouveau ClientId.

    essai de revenir peut être a plus simple (2 repeater imbrique 1 item chacun et ainsi de suite)

    désolé de ne pas être d'un plus grand secours; Il me faudrait peut être le code.

  8. #8
    Membre éclairé Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    367
    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 : 367
    Par défaut
    C'est imbouffable comme code, dans tous les cas, je ne fais rien qui puisse toucher aux ID (à part la modif que j'ai rajouté) donc je sais pas trop d'où ca peut venir

    Je vais faire un test vite fait avec des repeater imbriqués sur un site de test

    EDIT : J'ai testé le code suivant

    fichier aspx
    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
    28
    29
    30
    31
    32
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="index.aspx.cs" Inherits="test_index" %>
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Page sans titre</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:Repeater ID="rpt_1" runat="server" OnItemCreated="rpt_1_ItemCreated">
                <ItemTemplate>
                    <asp:TextBox ID="txb_1" runat="server"></asp:TextBox><br />
     
                    <asp:Repeater ID="rpt_2" runat="server" OnItemCreated="rpt_2_ItemCreated">
                        <ItemTemplate>
                            -<asp:TextBox ID="txb_2" runat="server"></asp:TextBox><br />
     
                            <asp:Repeater ID="rpt_3" runat="server" OnItemCreated="rpt_3_ItemCreated">
                                <ItemTemplate>
                                    + -<asp:TextBox ID="txb_3" runat="server"></asp:TextBox><br />
                                </ItemTemplate>
                            </asp:Repeater>
                        </ItemTemplate>
                    </asp:Repeater>
                </ItemTemplate>
            </asp:Repeater>
        </div>
        </form>
    </body>
    </html>
    code behind
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;
    using System.IO;
    using Mx_Export;
    using System.Xml;
    using Mx_Reseau;
    using Mx_Evals;
     
    public partial class test_index : System.Web.UI.Page
    {
     
        protected void Page_Load(object sender, EventArgs e)
        {
            DataTable tbl_1 = new DataTable();
     
            tbl_1.Columns.Add("COL_BIDON", typeof(string));
     
            tbl_1.Rows.Add("Ligne 1");
            tbl_1.Rows.Add("Ligne 2");
     
            rpt_1.DataSource = tbl_1;
            rpt_1.DataBind();
        }
     
        protected void rpt_1_ItemCreated(object sender, RepeaterItemEventArgs e)
        {
            TextBox txb_1 = (TextBox)e.Item.FindControl("txb_1");
            Repeater rpt_2 = (Repeater)e.Item.FindControl("rpt_2");
     
            txb_1.Text = ((DataRowView)e.Item.DataItem).Row["COL_BIDON"].ToString();
     
            DataTable tbl_2 = new DataTable();
     
            tbl_2.Columns.Add("COL_BIDON", typeof(string));
     
            tbl_2.Rows.Add("Détail 1");
            tbl_2.Rows.Add("Détail 2");
     
            rpt_2.DataSource = tbl_2;
            rpt_2.DataBind();
        }
     
        protected void rpt_2_ItemCreated(object sender, RepeaterItemEventArgs e)
        {
     
            TextBox txb_2 = (TextBox)e.Item.FindControl("txb_2");
            Repeater rpt_3 = (Repeater)e.Item.FindControl("rpt_3");
     
            txb_2.Text = ((DataRowView)e.Item.DataItem).Row["COL_BIDON"].ToString();
     
            DataTable tbl_3 = new DataTable();
     
            tbl_3.Columns.Add("COL_BIDON", typeof(string));
     
            tbl_3.Rows.Add("Sous-détail 1");
            tbl_3.Rows.Add("Sous-détail 2");
     
            rpt_3.DataSource = tbl_3;
            rpt_3.DataBind();
        }
     
        protected void rpt_3_ItemCreated(object sender, RepeaterItemEventArgs e)
        {
     
            TextBox txb_3 = (TextBox)e.Item.FindControl("txb_3");
     
            txb_3.Text = ((DataRowView)e.Item.DataItem).Row["COL_BIDON"].ToString();
        }
    }
    Faut pas s'inquiéter des using en pagaille qu'il y a dans la page, mais c'est ma page de test qui est dans le même environement que le site de dev (à vrai dire, c'est un sous dossier, ca me permet d'être exactement dans les même conditions) et j'en suis pas à mon premier test

    Celle là fonctionne... Je vais me repencher sur mon code

  9. #9
    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
    Bonne chance, si tu trouve ce qui allait pas fais moi signe. ton problème m'intrigue .

  10. #10
    Membre éclairé Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    367
    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 : 367
    Par défaut
    Je viens de trouver un élément de réponse, et je comprends pas ce qui se passe (en fait, j'ai trouvé la source du problème et ca me semble un GROS bug de ASP.Net ou alors il y a quelque chose que j'ai pas saisi dans ASP.Net

    J'ai créé une autre page qui utilise le même système de CallBack (en fait, c'est une autre vision de la même page... Dès fois le client a des idées bizarre, 2x la même page, mais une avec des infos en moins )

    Voici 2 codes

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    protected void rpt_actions_ItemCreated(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.DataItem == null)
            return;
     
        DataRow cur_row = ((DataRowView)e.Item.DataItem).Row;
     
        Literal txt_num = (Literal)e.Item.FindControl("txt_num");
     
        Label lbl_dataReal = (Label)e.Item.FindControl("lbl_dateReal");
        Label lbl_real = (Label)e.Item.FindControl("lbl_real");
        Label lbl_propReal = (Label)e.Item.FindControl("lbl_propReal");
        Label lbl_commentaire = (Label)e.Item.FindControl("lbl_commentaire");
     
        TextBox txb_dateReal = (TextBox)e.Item.FindControl("txb_dateReal");
        TextBox txb_real = (TextBox)e.Item.FindControl("txb_real");
        TextBox txb_commentaire = (TextBox)e.Item.FindControl("txb_commentaire");
     
        txt_num.Text = (e.Item.ItemIndex + 1).ToString();
     
        string classeLigne = e.Item.ItemIndex % 2 == 0 ? "odd" : "even";
     
        /*string js_onChange = ClientScript.GetCallbackEventReference(this, "'action_id=" + cur_row["ACTION_ID"] +
                                                                          "&lbl_dateReal=" + lbl_dataReal.ClientID +
                                                                          "&txb_dateReal=" + txb_dateReal.ClientID +
                                                                          "&dateReal=' + $('" + txb_dateReal.ClientID + "').value + '" +
                                                                          "&lbl_real=" + lbl_real.ClientID +
                                                                          "&txb_real=" + txb_real.ClientID +
                                                                          "&real=' + $('" + txb_real.ClientID + "').value + '" +
                                                                          "&lbl_propReal=" + lbl_propReal.ClientID +
                                                                          "&lbl_commentaire=" + lbl_commentaire.ClientID +
                                                                          "&commentaire=' + escapeHTML($('" + txb_commentaire.ClientID + "').value) + '" +
                                                                          "&classe_ligne=" + classeLigne +
                                                                          "&objectif=" + cur_row["ACTION_OBJECTIF"] + "'",
                                                                          "t", "c", "e", true);*/
     
        string js_onChange = "javascript: alert('n\'importe quoi');";
     
        txb_commentaire.Attributes["onchange"] = js_onChange;
        txb_dateReal.Attributes["onchange"] = js_onChange;
        txb_real.Attributes["onchange"] = js_onChange;
    }
    Ce code me génère bien des ID uniques

    Ce code ci

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    protected void rpt_actions_ItemCreated(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.DataItem == null)
            return;
     
        DataRow cur_row = ((DataRowView)e.Item.DataItem).Row;
     
        Literal txt_num = (Literal)e.Item.FindControl("txt_num");
     
        Label lbl_dataReal = (Label)e.Item.FindControl("lbl_dateReal");
        Label lbl_real = (Label)e.Item.FindControl("lbl_real");
        Label lbl_propReal = (Label)e.Item.FindControl("lbl_propReal");
        Label lbl_commentaire = (Label)e.Item.FindControl("lbl_commentaire");
     
        TextBox txb_dateReal = (TextBox)e.Item.FindControl("txb_dateReal");
        TextBox txb_real = (TextBox)e.Item.FindControl("txb_real");
        TextBox txb_commentaire = (TextBox)e.Item.FindControl("txb_commentaire");
     
        txt_num.Text = (e.Item.ItemIndex + 1).ToString();
     
        string classeLigne = e.Item.ItemIndex % 2 == 0 ? "odd" : "even";
     
        string js_onChange = ClientScript.GetCallbackEventReference(this, "'action_id=" + cur_row["ACTION_ID"] +
                                                                          "&lbl_dateReal=" + lbl_dataReal.ClientID +
                                                                          "&txb_dateReal=" + txb_dateReal.ClientID +
                                                                          "&dateReal=' + $('" + txb_dateReal.ClientID + "').value + '" +
                                                                          "&lbl_real=" + lbl_real.ClientID +
                                                                          "&txb_real=" + txb_real.ClientID +
                                                                          "&real=' + $('" + txb_real.ClientID + "').value + '" +
                                                                          "&lbl_propReal=" + lbl_propReal.ClientID +
                                                                          "&lbl_commentaire=" + lbl_commentaire.ClientID +
                                                                          "&commentaire=' + escapeHTML($('" + txb_commentaire.ClientID + "').value) + '" +
                                                                          "&classe_ligne=" + classeLigne +
                                                                          "&objectif=" + cur_row["ACTION_OBJECTIF"] + "'",
                                                                          "t", "c", "e", true);
     
        //string js_onChange = "javascript: alert('n\'importe quoi');";
     
        txb_commentaire.Attributes["onchange"] = js_onChange;
        txb_dateReal.Attributes["onchange"] = js_onChange;
        txb_real.Attributes["onchange"] = js_onChange;
    }
    Ne me génère plus d'ID uniques

    Si quelqu'un comprends ca, il a le droit à toute ma gratitude

    J'ai vu ca car ici je n'ai que 2 repeaters imbriqués, j'ai fais toute ma mécanique sans le CallBack, tout va bien, mes ID sont uniques.

    J'ai rajouté le CallBack (donc, le onChange sur les TextBox) et là, mes ID ne sont plus uniques... Je me suis tout d'abbord dit que ca venait de l'héritage de ICallBackEventHandler, je l'ai supprimé (et donc, j'ai supprimé le ClientScript.GetCallBackEventReference()) et là, mes ID étaient unique...

    Je me suis dit que le bug était trop gros pour qu'il n'ait pas été corrigé à la base (enfin, si bug il y avait). Et là, j'ai tout remis, petit à petit (j'ai donc remis l'héritage de ICallBackEventHandler et les 2 fonctions qui vont avec)

    OK tout va bien. Donc j'ai remis les ICallBackEventHandler. devant ICallbackEventHandler.GetCallbackResult() et ICallbackEventHandler.RaiseCallbackEvent(string eventArgument) (ca c'est juste pour que Visual Studio ne me mettes pas un petit carré bleu quand je clique sur ICallBackEventHandler ). Après tout, bug à la con, pourquoi ca ne viendrait pas d'ici... Et bien non... Le dernier truc en rapport avec les CallBack que j'ai utilisé, c'était donc le GetCallBackEventReference... Et là, miracle, quand on le remet, plus d'ID uniques

    Tiens dernier truc avant de poster (je viens de faire un test rapide)

    Si on remplace le js_onChange par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    string js_onChange = "javascript: alert('" + lbl_propReal.ClientID + "');";
    les ID ne sont plus unique...

    Dès que j'apelle un ClientID, je n'ai plus d'ID uniques... c'est con, parce que c'est parce que j'en ai besoin qu'ils ne sont plus uniques

  11. #11
    Membre éclairé Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    367
    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 : 367
    Par défaut
    Un deuxième post pour illustrer mes propos avec un exemple concret

    test.aspx
    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
    28
    29
    30
    31
    32
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="index.aspx.cs" Inherits="test_index" %>
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Page sans titre</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:Repeater ID="rpt_1" runat="server" OnItemCreated="rpt_1_ItemCreated">
                <ItemTemplate>
                    <asp:TextBox ID="txb_1" runat="server"></asp:TextBox><br />
     
                    <asp:Repeater ID="rpt_2" runat="server" OnItemCreated="rpt_2_ItemCreated">
                        <ItemTemplate>
                            -<asp:TextBox ID="txb_2" runat="server"></asp:TextBox><br />
     
                            <asp:Repeater ID="rpt_3" runat="server" OnItemCreated="rpt_3_ItemCreated">
                                <ItemTemplate>
                                    + -<asp:TextBox ID="txb_3" runat="server"></asp:TextBox><br />
                                </ItemTemplate>
                            </asp:Repeater>
                        </ItemTemplate>
                    </asp:Repeater>
                </ItemTemplate>
            </asp:Repeater>
        </div>
        </form>
    </body>
    </html>
    test.aspx.cs
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
     
    public partial class test_index : System.Web.UI.Page
    {
     
        protected void Page_Load(object sender, EventArgs e)
        {
            DataTable tbl_1 = new DataTable();
     
            tbl_1.Columns.Add("COL_BIDON", typeof(string));
     
            tbl_1.Rows.Add("Ligne 1");
            tbl_1.Rows.Add("Ligne 2");
     
            rpt_1.DataSource = tbl_1;
            rpt_1.DataBind();
        }
     
        protected void rpt_1_ItemCreated(object sender, RepeaterItemEventArgs e)
        {
            TextBox txb_1 = (TextBox)e.Item.FindControl("txb_1");
            Repeater rpt_2 = (Repeater)e.Item.FindControl("rpt_2");
     
            txb_1.Text = ((DataRowView)e.Item.DataItem).Row["COL_BIDON"].ToString();
     
            DataTable tbl_2 = new DataTable();
     
            tbl_2.Columns.Add("COL_BIDON", typeof(string));
     
            tbl_2.Rows.Add("Détail 1");
            tbl_2.Rows.Add("Détail 2");
     
            rpt_2.DataSource = tbl_2;
            rpt_2.DataBind();
        }
     
        protected void rpt_2_ItemCreated(object sender, RepeaterItemEventArgs e)
        {
     
            TextBox txb_2 = (TextBox)e.Item.FindControl("txb_2");
            Repeater rpt_3 = (Repeater)e.Item.FindControl("rpt_3");
     
            txb_2.Text = ((DataRowView)e.Item.DataItem).Row["COL_BIDON"].ToString();
     
            DataTable tbl_3 = new DataTable();
     
            tbl_3.Columns.Add("COL_BIDON", typeof(string));
     
            tbl_3.Rows.Add(txb_2.ClientID); // Ici la ligne qui gache tout
            tbl_3.Rows.Add("Sous-détail 2");
     
            rpt_3.DataSource = tbl_3;
            rpt_3.DataBind();
        }
     
        protected void rpt_3_ItemCreated(object sender, RepeaterItemEventArgs e)
        {
     
            TextBox txb_3 = (TextBox)e.Item.FindControl("txb_3");
     
            txb_3.Text = ((DataRowView)e.Item.DataItem).Row["COL_BIDON"].ToString();
        }
    }
    Les ID's des txb_2 qui sont générés sont identiques, alors que pour le reste, ils sont uniques (tout ca à cause de la ligne où j'ai rajouté "// Ici la ligne qui gache tout"

  12. #12
    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
    Ton probléme était trop bizarre j'ai donc décidé de tester .

    Comme je lavais dit precedement met toi sur le OnItemDataBound.

    La j'ai plus le problème d'id.

    Je dirais que le probleme vient du fait que sur le onItemCreted tu es juste au moment ou l'item seul est crée mais pas inséré dans le repeater que Sur le DataBound t'es pleins milieu du syteme de creation du repeater plutôt que de l'item. Donc avec l'id qui va bien

    Je pense que c'est ca.

  13. #13
    Membre éclairé Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    367
    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 : 367
    Par défaut
    Effectivement ca fonctionne, mais quand même, c'est pas logique que, dès que tu appelle le Client_ID qu'il devienne non unique


  14. #14
    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
    J'etais pas loin avec mon explication perso

    http://dotnetslackers.com/DataGrid/re-49612_Accessing_ClientID_or_UniqueID_too_early_can_cause_issues.aspx

    En gros pour les non anglophone si on accéde a un élement trop tot (avant que la hierarchie soit crée) ca peut poser probléme.

    En l'occurrence dans le onItemCreated l'item n'est pas encore ajouté a la collection du repeater et donc son Id pas encore crée par rapport a la hiérarchie.

    Voilou plus d'info dans le lien du dessus

  15. #15
    Membre éclairé Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    367
    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 : 367
    Par défaut
    j'ai appris quelque chose

    Je pensait que le "OnItemDataBound" était exécuté avant le "OnItemCreated" et non pas après... Et tout ca pour une histoire de cache mes ID ne sont plus uniques

+ 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