Création dynamique de champs

Résolu
quineman Messages postés 72 Date d'inscription jeudi 30 novembre 2000 Statut Membre Dernière intervention 10 novembre 2008 - 22 août 2006 à 20:33
quineman Messages postés 72 Date d'inscription jeudi 30 novembre 2000 Statut Membre Dernière intervention 10 novembre 2008 - 24 août 2006 à 21:48
Je souhaite créer un formulaire dépendant d'un nombre définit par l'utilisateur.
Si l'utilisateur souhaite 6 personnes, alors 6 formulaire de renseignements de personnes doivent apparaitre sur la meme page... Pour cela, il faut que je créé des champs de façon dynamique. Puis que je récupére ces champs pour faire une boucle d'insert.
Je l'ai déjà fait en ASP en utilisant des index pour nommer mes champs et en les récupérant pour créer ma boucle mais en .NET, je ne vois pas du tout comment faire et je ne crois pas que les index pour nommer les champs soit très propres. De plus je sais qu'il existe une méthode duplicate pour les controles...
Personne ne serait m'orienter dans mes recherches, la je bloqueeeeeeeeeeeee

d'avance merci

6 réponses

jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
23 août 2006 à 01:23
Bonjour,

Je viens rapidement de te faire un exemple :

Default.aspx :

<%@PageLanguage="C#"%><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??>

 

<!DOCTYPEhtmlPUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<scriptrunat="server">

   

 

    privatevoid Page_Load(Object sender, EventArgs e)

    {

        int countUC;

        if (int.TryParse(Request.QueryString["countUC"], out countUC))

        {

            MultiView1.ActiveViewIndex = 1;

            for (int i = 0; i < countUC; i++)

            {

                Control c = Page.LoadControl("UCPersonne.ascx");

                PHUC.Controls.Add(c);

            }

        }

    }

 

    privatevoid ButtonAddFields_Click(Object sender, EventArgs e)

    {

        Response.Redirect("Default.aspx?countUC=" + TextBoxNbPersonnesToAdd.Text);

    }

 

    privatevoid ButtonAddPersonnes_Click(Object sender, EventArgs e)

    {

        System.Data.DataTable table = new System.Data.DataTable("Personne");

        table.Columns.Add("FirstName", typeof(String));

        table.Columns.Add("LastName", typeof(String));

 

        foreach (Control c in PHUC.Controls)

        {

            if (c isUserControl)

            {

                System.Data.DataRow row = table.NewRow();

                row["FirstName"] = ((TextBox)c.FindControl("TextBoxFirstName")).Text;

                row["LastName"] = ((TextBox)c.FindControl("TextBoxLastName")).Text;

                table.Rows.Add(row);

            }

        }

        MultiView1.ActiveViewIndex = 2;

        GridViewPersonnes.DataSource = table;

        GridViewPersonnes.DataBind();

    }

   

</script>

 

<htmlxmlns="http://www.w3.org/1999/xhtml">

<headrunat="server">

    <title>Untitled Page</title>

</head>

<body>

    <formid="form1"runat="server">

        <div>

            <asp:MultiViewID="MultiView1"runat="server"ActiveViewIndex="0">

                <asp:Viewrunat="server">

                    <asp:TextBoxID="TextBoxNbPersonnesToAdd"runat="server"Text="3"/><asp:ButtonID="ButtonAddFields"

                        runat="server"Text="Generate fields"OnClick="ButtonAddFields_Click"/>

                </asp:View>

                <asp:Viewrunat="server">

                    <asp:PlaceHolderID="PHUC"runat="server"/>

                    <asp:ButtonID="ButtonAddPersonnes"runat="server"Text="Add personnes"OnClick="ButtonAddPersonnes_Click"/>

                </asp:View>

                <asp:Viewrunat="server">

                    <asp:GridViewrunat="server"ID="GridViewPersonnes"AutoGenerateColumns="true">

                    </asp:GridView>

                </asp:View>

            </asp:MultiView>

        </div>

    </form>

</body>

</html>

 

UCPersonne.ascx

<%@ControlLanguage="C#"ClassName="UCPersonne"%>

 

<scriptrunat="server">

 

</script>

 

<asp:LabelID="LabelFirstName"runat="server"AssociatedControlID="TextBoxFirstName"EnableViewState="false">Prénom :</asp:Label><asp:TextBoxID="TextBoxFirstName"runat="server"></asp:TextBox><br/>

<asp:LabelID="LabelLastName"runat="server"AssociatedControlID="TextBoxLastName"EnableViewState="false">Nom :</asp:Label><asp:TextBoxID="TextBoxLastName"runat="server"></asp:TextBox><br/>

<hr/>

C'est une méthode trés crade et je t'interdis de faire aussi sale que moi ;-) mais j'espere que tu comprendras le principe du jeu :-) il y aurais d'autres facons de faire sans passer par un response.redirect mais c'est la facon la plus simple de faire.

<hr />Cyril - MVS - MCP
3
mdemo Messages postés 90 Date d'inscription mardi 21 mars 2006 Statut Membre Dernière intervention 10 mai 2010
23 août 2006 à 01:21
Bonjour,


Tu peux placer dynamiquement des champs en utilisant un PlaceHolder par exemple. Libre à toi de leur attribuer dynamiquement un nom qui te permettra de les récupérer. (ex: user1, user2...address1, address2...)


Mais pourquoi n'utiliserais-tu pas un contrôle serveur type formview (ou autre) ? Tu lui mets dynamiquement un PageIndex à 6 et ça devrait marcher pour toi (si tu es connecté à une base de données). Ca me parait plus simple, mais je n'ai peut être pas bien compris ton besoin.

Good luck.


 


 
0
quineman Messages postés 72 Date d'inscription jeudi 30 novembre 2000 Statut Membre Dernière intervention 10 novembre 2008
23 août 2006 à 18:34
La piste du formView me parait intéressante mais la ta solution Cyril marche vraiment Nickel, je te remercie de m'avoir débloqué encore une fois. Je te donnerais l'adresse du site quand il sera fini pour que tu me dise ce que tu en pense si ça t'interesse biensur.
MERCI  !!!
0
quineman Messages postés 72 Date d'inscription jeudi 30 novembre 2000 Statut Membre Dernière intervention 10 novembre 2008
24 août 2006 à 18:12
J'ai un problème bizare : mon placeholder ne récupére pas les controles...
Ma boucle ne fonctionne donc pas
For Each c As Control In PHUC.Controls
next c
Quand j'utilise la methode HasControls, il me renvoit false...
Mon place holder est sur ma page, donc pas besoin de le déclarer...
Est ce que ça pourrait être du au fait que je suis en VB.NET ?
Merci
0

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

Posez votre question
quineman Messages postés 72 Date d'inscription jeudi 30 novembre 2000 Statut Membre Dernière intervention 10 novembre 2008
24 août 2006 à 18:24
J'ai essayé d'utiliser ma boucle juste après avoir créé mes controles dans le placeholder et elle marche.
Dans la procedure click qui suit, je ne retrouve plus les controls...
0
quineman Messages postés 72 Date d'inscription jeudi 30 novembre 2000 Statut Membre Dernière intervention 10 novembre 2008
24 août 2006 à 21:48
En fait, excuse, j'avais mal compris le code.
Il faut que le :
Dim c As Control = Page.LoadControl("../ascx/UCPersonne.ascx")
PHUC.Controls.Add(c)
soit dans le page load sinon ca ne marche pas...
0
Rejoignez-nous