Contrôles dynamiques dans un PlaceHolder qui disparaissent au PostBack

Résolu
cs_zarzar Messages postés 38 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 7 juillet 2006 - 29 juin 2006 à 10:54
lapinroi Messages postés 1 Date d'inscription mardi 4 juillet 2006 Statut Membre Dernière intervention 4 juillet 2006 - 4 juil. 2006 à 19:47
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

cs_zarzar Messages postés 38 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 7 juillet 2006
29 juin 2006 à 16:51
    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
3
preti Messages postés 53 Date d'inscription mercredi 19 mars 2003 Statut Membre Dernière intervention 7 septembre 2006
29 juin 2006 à 11:01
Pourquoi tu n'utilises pas le page_Load ??
0
cs_zarzar Messages postés 38 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 7 juillet 2006
29 juin 2006 à 11:04
essayé aussi, même comportement
0
preti Messages postés 53 Date d'inscription mercredi 19 mars 2003 Statut Membre Dernière intervention 7 septembre 2006
29 juin 2006 à 11:07
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 ??
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_zarzar Messages postés 38 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 7 juillet 2006
29 juin 2006 à 11:10
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....
0
preti Messages postés 53 Date d'inscription mercredi 19 mars 2003 Statut Membre Dernière intervention 7 septembre 2006
29 juin 2006 à 11:12
peux tu me donner ta fonction ??
0
cs_zarzar Messages postés 38 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 7 juillet 2006
29 juin 2006 à 11:20
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);
        }
    }
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
29 juin 2006 à 12:45
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
0
cs_zarzar Messages postés 38 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 7 juillet 2006
29 juin 2006 à 14:13
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 ?
0
lapinroi Messages postés 1 Date d'inscription mardi 4 juillet 2006 Statut Membre Dernière intervention 4 juillet 2006
4 juil. 2006 à 19:47
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
0
Rejoignez-nous