Contrôles dynamiques [Résolu]

Signaler
Messages postés
10
Date d'inscription
jeudi 19 septembre 2002
Statut
Membre
Dernière intervention
1 août 2006
-
Messages postés
38
Date d'inscription
dimanche 29 juin 2003
Statut
Membre
Dernière intervention
7 juillet 2006
-
Bonjour,



J'aimerais créer des contrôles serveur dynamiquement en fonction d'un chiffre entré dans un précédent formulaire (créer 5 TextBox par exemple).

J'ai vu une solution utilisant un PlaceHolder mais elle ne me convient pas car il faudrait que je mette tous les textbox dans le même place holder. Or, je génère du code html en fonction du nombre de textbox désirés (dans mon exemple 5 tableaux html contenant 1 textbox chacun).




J'ai aussi essayé de faire une boucle for en spécifiant un l'id du textbox en fonction de la valeur du compteur (int i), mais ce ne marche pas non plus (l'id est considéré comme invalide par visual studio) 







Quelqu'un aurait-il une idée ou une solution à me donner ?

Merci d'avance.

19 réponses

Messages postés
10
Date d'inscription
jeudi 19 septembre 2002
Statut
Membre
Dernière intervention
1 août 2006

Bonjour,

Merci de ta réponse.

J'ai essayé cette méthode mais le problème c'est que je dois aussi générer du code html et pas seulement des contrôles.
Il faudrait donc que je génère également le placeholder dynamiquement à l'endroit précis ou je veux mettre le textbox.

Précision : Si l'utilisateur veut créer 5 textbox, je dois générer 5 tableaux HTML qui contiennent 1 textbox chacun soit 5 textbox (le chiffre 5 étant un simple exemple, si l'utilisateur en veut 10 il en aura 10).

La solution que j'ai trouvé pour l'instant c'est d'utiliser un repeater et de mettre un arraylist comme datasource, qui contient autant d'élements que le nombre textbox désirés. Ca marche pas trop mal, mais j'aurais aimé faire plus simple...
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
27
bonjour,

pourquoi pas une boucle ?

for i as integer = 0 to 5
dim moncontrol as new button
moncontrol.id = "button" & i.tostring()
placeholder1.controls.Add(moncontrol)
next

<hr />Cyril - MVS - MCP
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
27
Je vois pas le problème avec un repeater, ca correspond à ce que tu recherches ...

<hr />Cyril - MVS - MCP
Messages postés
10
Date d'inscription
jeudi 19 septembre 2002
Statut
Membre
Dernière intervention
1 août 2006

Plus j'avance et plus je pense que ça correspond bien à ce que je recherche en effet.

Merci pour ton aide.
Messages postés
53
Date d'inscription
mercredi 19 mars 2003
Statut
Membre
Dernière intervention
7 septembre 2006

Pour faire plus simple tu fais un for sur ton nombre de textbox et en même temps que tu crées tes textbox tu crées un htmltable (associé à un htmltablerow et htmltablecell) puis tu places ta checkbox dans ta cell, ta cell dans ta row et ta row dans ton table et ton table dans ton placeholder :-) et le tour et joué ca donne quelque chose du genre :

HtmlTable tbl;
HtmlTableRow row;
HtmlTableCell cell;
HtmlInputText txt;
for(int i=0;i<ton nombre de checkbox;i++)
{
tbl = new HtmlTable();
row = new HtmlTableRow();
cell = new HtmlTableCell();
txt = new HtmlInputText();
txt.ID="txt"+i;
cell.Controls.Add(txt);
row.Cells.Add(cell);
tbl.Rows.Add(row);
Tonplaceholder.Controls.Add(tbl);
}
Messages postés
38
Date d'inscription
dimanche 29 juin 2003
Statut
Membre
Dernière intervention
7 juillet 2006

bonjour
je suis interessé par ce sujet
j'ai placé moi aussi des contrôles générés dynamiquement dans des HtmlTableCell, puis ...TableRow puis ...Table et enfin j'ai ajouté mon HtmlTable à PlaceHolder1.Controls

j'ai un traitement à faire sur ts mes controles
comment les parcourir maintenant ?
merci bcp d'avance
Messages postés
10
Date d'inscription
jeudi 19 septembre 2002
Statut
Membre
Dernière intervention
1 août 2006

Pour récupérer les contrôles que tu as créé dynamiquement tu peux faire une boucle foreach sur PlaceHolder1.Controls.
Chaque itération de ta boucle sera un objet Control à partir duquel tu pourra récupérer les infos qui t'intressent (GetType() :  pour savoir le type de controle : textbox, dropdownlist, ... et ID pour savoir quel est le controle en cours par exemple )
Messages postés
38
Date d'inscription
dimanche 29 juin 2003
Statut
Membre
Dernière intervention
7 juillet 2006

    bonne idée effectivement
mais ça marche pô :(

je me suis fait la ptite boucle foreach comme prévu

        foreach(Control ctrl in PlaceHolder1.Controls)
        {
            string type = ctrl.GetType().ToString(); // pour tester
            string id = ctrl.ID;
        }

il rentre pas dedans (genre aucun contrôle)
alors que mon placeholder est loin d'être vide (je le vois bien, il est affiché)
une explication ?
Messages postés
38
Date d'inscription
dimanche 29 juin 2003
Statut
Membre
Dernière intervention
7 juillet 2006

pour être plus précis
en fait c bon à un autre emplacement j'ai pu obtenir mon PlaceHolder avec des contrôles
mais là vient mon soucis de départ
les seuls contrôles que je vois passer dans le foreach est mon HtmlTable
pas mes Texbox, Chekbox, Ddl, ... que j'ai mis dans le HtmlTable
snif
Messages postés
10
Date d'inscription
jeudi 19 septembre 2002
Statut
Membre
Dernière intervention
1 août 2006

De la même façon, un fois que tu as récupéré un HTMLTable tu peux faire tonHtmlTable.Controls
Messages postés
38
Date d'inscription
dimanche 29 juin 2003
Statut
Membre
Dernière intervention
7 juillet 2006

ah c vrai, je suis un peu c...
désolé

mais faut que je descende "bas" : HtmlTable > TableRow > TableCell > mes controles
y aurait-il un moyen plus pratique (et/ou plus élégant) que 4 foreach imbriqués ?

merci encore
Messages postés
53
Date d'inscription
mercredi 19 mars 2003
Statut
Membre
Dernière intervention
7 septembre 2006

C'est quoi le traitement que tu veux opérer sur tes controles ??
Messages postés
38
Date d'inscription
dimanche 29 juin 2003
Statut
Membre
Dernière intervention
7 juillet 2006

lire la valeur d'une textbox (par exemple, savoir que ds la textbox36 j'ai telle valeur)
voir si une checkbox est cochée
changer l'élément sélectionné dans une dropdown
ce genre de chose
ça répond à ta question ?
Messages postés
53
Date d'inscription
mercredi 19 mars 2003
Statut
Membre
Dernière intervention
7 septembre 2006

ben pourquoi tu fais pas tout ca en postant ton formulaire, et tu fais le traitement sur le isPostBack...
Messages postés
38
Date d'inscription
dimanche 29 juin 2003
Statut
Membre
Dernière intervention
7 juillet 2006

ça change quoi ?
je suis pas trop ...:(
Messages postés
53
Date d'inscription
mercredi 19 mars 2003
Statut
Membre
Dernière intervention
7 septembre 2006

ben disons que l utilisateurs rentre les champs puis lorsque tu fais un postback (donc tu cliques sur submit) tu envois tes infos. Ce qui déclenche le isPostBack à true (tu peux tester sur un if) si oui tu check tes datas style tu fais un Request.Form["ton_champ"]=la valeur entrée etc...

hésite pas si tu as une question
Messages postés
38
Date d'inscription
dimanche 29 juin 2003
Statut
Membre
Dernière intervention
7 juillet 2006

comment se fait-il que mes controles disparaissent ?
explication : la page est quasi vide au départ
un bouton déclenche la création de mon formulaire (controles dyn) placé dans mon placeholder1
tout apparait
je souhaite déclencher les actions au clic sur un autre bouton
je l'ai créé, double clicqué dessus pour éditer l'event click, qq lignes...
je clique dessus, tout mon placeholder disparait
c'est normal ?
le fait de poster la page fait partir mes controles ?
merci pr ton aide
Messages postés
53
Date d'inscription
mercredi 19 mars 2003
Statut
Membre
Dernière intervention
7 septembre 2006

oui, bye bye les contôles il faut que tu appelles la fonction pour afficher tes contrôles aussi dans le postback et désactiver le bouton qui appelle cette fonction pour éviter de regenérer le tout

Hésite pas si jamais cela reste flou
Messages postés
38
Date d'inscription
dimanche 29 juin 2003
Statut
Membre
Dernière intervention
7 juillet 2006

oui ca reste un peu flou
je vais détailler ce que j'ai :

une page aspx avec un fileupload et un bouton ok
l'utilisateur mets son fichier (xls pour tout dire) et appuis sur ok
la méthode click rattachée à ok fait le boulot sur le fichier (sauvegarde, plus d'autes trucs)
le fileupload et le bouton ok (dans un panel ts les 2) sont ensuite cachés
puis en fin de méthode lance generateForm()

generateForm() est une méthode qui vient pousser tous les controles dans mon placeholder (évidemment j'ai choisi le dynamique car en fait les controles sont fonction de ce qui a été lu dans le fichier uploadé)

sur la page j'ai donc à ce moment là
un grand formulaire, l'utilisateur peut saisir ce qu'il veut, etc...

et là j'ai ce fameaux bouton qui au clic doit en fait "préregler" certaines dropdown du formulaire tout bien (mode automatique de mon appli en gros)
donc je veux pouvoir accéder mes controles dans la méthode clic de ce bouton et toucher à mon formulaire et le voir comment avant

est-ce impossible ? :-S

pour info rien dans mon page_load

si tu vois mieux...