Création dynamique de champs [Résolu]

Signaler
Messages postés
72
Date d'inscription
jeudi 30 novembre 2000
Statut
Membre
Dernière intervention
10 novembre 2008
-
Messages postés
72
Date d'inscription
jeudi 30 novembre 2000
Statut
Membre
Dernière intervention
10 novembre 2008
-
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

Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
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
Messages postés
90
Date d'inscription
mardi 21 mars 2006
Statut
Membre
Dernière intervention
10 mai 2010

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.


 


 
Messages postés
72
Date d'inscription
jeudi 30 novembre 2000
Statut
Membre
Dernière intervention
10 novembre 2008

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  !!!
Messages postés
72
Date d'inscription
jeudi 30 novembre 2000
Statut
Membre
Dernière intervention
10 novembre 2008

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
Messages postés
72
Date d'inscription
jeudi 30 novembre 2000
Statut
Membre
Dernière intervention
10 novembre 2008

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...
Messages postés
72
Date d'inscription
jeudi 30 novembre 2000
Statut
Membre
Dernière intervention
10 novembre 2008

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...