Contrôles dynamiques dans un PlaceHolder qui disparaissent au PostBack [Résolu]

Signaler
Messages postés
38
Date d'inscription
dimanche 29 juin 2003
Statut
Membre
Dernière intervention
7 juillet 2006
-
Messages postés
1
Date d'inscription
mardi 4 juillet 2006
Statut
Membre
Dernière intervention
4 juillet 2006
-
j'ai un problème, j'ai vu qu'il était fréquent mais je ne parviens pas à appliquer les solutions adéquates trouvées

je crée des contrôles dynamiques que je place dans un placeholder
tout s'affiche bien une 1ère fois, mais au clic sur un bouton (provoquant donc un postback), je perds tout

pourtant, suite à ce que j'ai lu sur le sujet, j'appelle ma méthode de génération du formulaire dans la méthode Page_Init
je suis cependant obligé de "protéger" ceci avec un boolean pour ne passer qu'une seule fois (sinon je me tappe une exception disant en gros : controle déjà existant avec le même ID)
extrait :

    protected void Page_Init(object sender, EventArgs e)
    {
            if (genForm) // ce bool est init à true
            {
                ...
                generateForm(); // méthode qui comporte les "PlaceHolder1.Controls.Add(...)"
                ....
                genForm = false; // bool passe à false, j'ai mis ça par rapport à ce que je disais plus haut...
            }
    }

pas moyen que ça marche pr le moment
tout aide serait la bienvenue..... (vraiment)
merki

10 réponses

Messages postés
38
Date d'inscription
dimanche 29 juin 2003
Statut
Membre
Dernière intervention
7 juillet 2006

    problème résolu
il y avait un soucis dans les id des controles générés
un détail mais qui faisait tout planter au 2ème affichage
merci bcp pr l'aide
Messages postés
53
Date d'inscription
mercredi 19 mars 2003
Statut
Membre
Dernière intervention
7 septembre 2006

Pourquoi tu n'utilises pas le page_Load ??
Messages postés
38
Date d'inscription
dimanche 29 juin 2003
Statut
Membre
Dernière intervention
7 juillet 2006

essayé aussi, même comportement
Messages postés
53
Date d'inscription
mercredi 19 mars 2003
Statut
Membre
Dernière intervention
7 septembre 2006

dans ton page load tu as donc juste l appel à ta fonction cela devrait fonctionner... si tu mets juste cette appelle il t'affiche rien ?? tu as essayé de faire du debugging afin de voir si il rentre bien dans ta fonction ??
Messages postés
38
Date d'inscription
dimanche 29 juin 2003
Statut
Membre
Dernière intervention
7 juillet 2006

si je fais qqch du style :
    protected void Page_Load(object sender, EventArgs e)
    {
        generateForm();
    }

j'ai mon formulaire une 1ère fois, puis au clic :
Plusieurs contrôles avec le même ID 'lbSfField0' ont été trouvés.  etc....
Messages postés
53
Date d'inscription
mercredi 19 mars 2003
Statut
Membre
Dernière intervention
7 septembre 2006

peux tu me donner ta fonction ??
Messages postés
38
Date d'inscription
dimanche 29 juin 2003
Statut
Membre
Dernière intervention
7 juillet 2006

attention elle est pas petite !
en fait pr détailler, je crée des HtmlTable (avec des Rows puis des Cells) et dedans je dépose mes contrôles asp
certains objets (ex
describeSObjectResults sont dans mon code en static, je l'ai tjs)

 
   private void generateForm()

    {

        DropDownList ddl;
        Label lb;
        CheckBox cbMandatory;
        TextBox tbDefaultValue;
        DropDownList ddlDefaultValue;
        CheckBox cbDefaultValue;

        HtmlTable tbl;
        HtmlTableRow row;
        HtmlTableCell cell;

        for (int x = 0; x < describeSObjectResults.Length; x++)
        {
            tbl = new HtmlTable();
            row = new HtmlTableRow();
            cell = new HtmlTableCell("th");
            cell.Controls.Add(new LiteralControl("Salesforce field"));
            row.Cells.Add(cell);
            cell = new HtmlTableCell("th");
            cell.Controls.Add(new LiteralControl("File field"));
            row.Cells.Add(cell);
            cell = new HtmlTableCell("th");
            cell.Controls.Add(new LiteralControl("Mandatory"));
            row.Cells.Add(cell);
            cell = new HtmlTableCell("th");
            cell.Controls.Add(new LiteralControl("Default value"));
            row.Cells.Add(cell);

            tbl.Rows.Add(row);

            for (int i = 0; i < describeSObjectResults[x].fields.Length; i++)
            {
                if ((describeSObjectResults[x].fields[i].createable || describeSObjectResults[x].fields[i].name == "Id") && !fieldsToBeHiddenAl.Contains(describeSObjectResults[x].fields[i].name))
                // (Sf field is creatable or is an ID) and not in the "ToBeHidden" list
                {
                    row = new HtmlTableRow();

                    // Salesforce field
                    lb = new Label();
                    lb.ID = "lbSfField" + i;
                    if (describeSObjectResults[x].fields[i].label.EndsWith("ID") && describeSObjectResults[x].fields[i].name != "Id")
                    {
                        lb.Text = describeSObjectResults[x].fields[i].label.Replace(" ID", "");
                    }
                    else
                    {
                        lb.Text = describeSObjectResults[x].fields[i].name;
                    }
                    cell = new HtmlTableCell();
                    cell.Width = "150px";
                    cell.Align = "right";
                    cell.Controls.Add(lb);
                    row.Cells.Add(cell);
                    lb.Dispose();

                    // File field
                    ddl = new DropDownList();
                    ddl.ID = "ddlFileFields" + i;
                    ddl.Items.Add("-- none selected --");
                    for (int j = 0; j < fileFields.Count; j++)
                    {
                        ddl.Items.Add(fileFields[j].ToString());
                    }

                    cell = new HtmlTableCell();
                    cell.Controls.Add(ddl);
                    row.Cells.Add(cell);
                    ddl.Dispose();

                    // Mandatory
                    cbMandatory = new CheckBox();
                    cbMandatory.ID = "cbMandatory" + i;
                    cell = new HtmlTableCell();
                    cell.Align = "center";
                    cell.Controls.Add(cbMandatory);
                    row.Cells.Add(cell);
                    cbMandatory.Dispose();

                    // je t'épargne ici, un gros switch qui n'apporterait rien au sujet                  

                    row.Cells.Add(cell);

                    //
                    tbl.Rows.Add(row);
                }
            }
            PlaceHolder1.Controls.Add(tbl);
        }
    }
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
27
Bonjour,

il faut effectivement mettre tout dans le page_init pour construire l'arbre des controles convenablement !

Par contre je ne comprend pas le problème, à quoi sert le boolean ? t'es sur qu'il est à true lors du deuxieme passage ? ta fonction est bien appellé, vérifie en mettant un point d'arret

<hr />Cyril - MVS - MCP
Messages postés
38
Date d'inscription
dimanche 29 juin 2003
Statut
Membre
Dernière intervention
7 juillet 2006

mais si je mets juste
protected void Page_Init(object sender, EventArgs e)
    {
        generateForm();
    }

la deuxième fois il repasse dans generateForm, et ensuite je me prends
Plusieurs contrôles avec le même ID 'lbSfField0' ont été trouvés. FindControl requiert que les contrôles aient des ID uniques.

(lbSfField0 c'est le mieux controle)

c'est logique en fait je trouve

dnc le truc super bizarre, c'est qu'il "garde" les controles (au sens ou si je repasse dans ma génération, il ne peut pas recréer des controles avec les memes id), mais il veut pas me les afficher
apres le postback le placeholder est vide (count à 0)

c'est dingue
trop mal foutu qd meme ces controles dynamiques, non ?
Messages postés
1
Date d'inscription
mardi 4 juillet 2006
Statut
Membre
Dernière intervention
4 juillet 2006

j'ai le meme problème au 2ème affichage après j'ai accroché un checkbox, (controle déjà existant avec le même ID)

mais j'ai bien defini tous les controls de tableau, pour ce checkbox:



Dim

celCbx AsNew TableCell





celCbx.Text = ""








tout aide serait la bienvenue

merci