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

cs_zarzar 39 Messages postés dimanche 29 juin 2003Date d'inscription 7 juillet 2006 Dernière intervention - 29 juin 2006 à 10:54 - Dernière réponse : lapinroi 1 Messages postés mardi 4 juillet 2006Date d'inscription 4 juillet 2006 Dernière intervention
- 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
Afficher la suite 

Votre réponse

10 réponses

cs_zarzar 39 Messages postés dimanche 29 juin 2003Date d'inscription 7 juillet 2006 Dernière intervention - 29 juin 2006 à 16:51
+3
Utile
    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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_zarzar
preti 53 Messages postés mercredi 19 mars 2003Date d'inscription 7 septembre 2006 Dernière intervention - 29 juin 2006 à 11:01
0
Utile
Pourquoi tu n'utilises pas le page_Load ??
Commenter la réponse de preti
cs_zarzar 39 Messages postés dimanche 29 juin 2003Date d'inscription 7 juillet 2006 Dernière intervention - 29 juin 2006 à 11:04
0
Utile
essayé aussi, même comportement
Commenter la réponse de cs_zarzar
preti 53 Messages postés mercredi 19 mars 2003Date d'inscription 7 septembre 2006 Dernière intervention - 29 juin 2006 à 11:07
0
Utile
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 ??
Commenter la réponse de preti
cs_zarzar 39 Messages postés dimanche 29 juin 2003Date d'inscription 7 juillet 2006 Dernière intervention - 29 juin 2006 à 11:10
0
Utile
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....
Commenter la réponse de cs_zarzar
preti 53 Messages postés mercredi 19 mars 2003Date d'inscription 7 septembre 2006 Dernière intervention - 29 juin 2006 à 11:12
0
Utile
peux tu me donner ta fonction ??
Commenter la réponse de preti
cs_zarzar 39 Messages postés dimanche 29 juin 2003Date d'inscription 7 juillet 2006 Dernière intervention - 29 juin 2006 à 11:20
0
Utile
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);
        }
    }
Commenter la réponse de cs_zarzar
jesusonline 6827 Messages postés dimanche 15 décembre 2002Date d'inscription 13 octobre 2010 Dernière intervention - 29 juin 2006 à 12:45
0
Utile
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
Commenter la réponse de jesusonline
cs_zarzar 39 Messages postés dimanche 29 juin 2003Date d'inscription 7 juillet 2006 Dernière intervention - 29 juin 2006 à 14:13
0
Utile
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 ?
Commenter la réponse de cs_zarzar
lapinroi 1 Messages postés mardi 4 juillet 2006Date d'inscription 4 juillet 2006 Dernière intervention - 4 juil. 2006 à 19:47
0
Utile
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
Commenter la réponse de lapinroi

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.