OVH Cloud OVH Cloud

Ajouter un WebControl dynamiquement

4 réponses
Avatar
Thibault
Bonjour à tous

J'ai un Webform dans lequel j'ai un PlaceHolder, un champ caché et un bouton.
Au chargement de la page, je crée un nouveau textbox que je place dans mon
PlaceHolder.

J'aimerais, lorsque je clique sur mon bouton, ajouter un nouveau textbox à
la suite de celui créé précédement.

Comment dois-je faire ?

Actuellement lorsque je clique sur mon bouton, ça m'ajoute bien un nouveau
textbox mais en me remplacant le précédent ... :-(((


Voici mon code :

Public Class AddWebcontrol
Inherits System.Web.UI.Page

Dim i As Integer = 0

#Region " Code généré par le Concepteur Web Form "

'Cet appel est requis par le Concepteur Web Form.
<System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()

End Sub
Protected WithEvents PlaceHolder1 As System.Web.UI.WebControls.PlaceHolder
Protected WithEvents Button1 As System.Web.UI.WebControls.Button
Protected WithEvents hide As System.Web.UI.HtmlControls.HtmlInputHidden

'REMARQUE : la déclaration d'espace réservé suivante est requise par le
Concepteur Web Form.
'Ne pas supprimer ou déplacer.
Private designerPlaceholderDeclaration As System.Object

Private Sub Page_Init(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Init
'CODEGEN : cet appel de méthode est requis par le Concepteur Web Form
'Ne le modifiez pas en utilisant l'éditeur de code.
InitializeComponent()
End Sub

#End Region

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
'Placez ici le code utilisateur pour initialiser la page
If Not (Page.IsPostBack) Then

i = 1

Dim mytextbox As TextBox
mytextbox = New TextBox
mytextbox.ID = "myTextbox" & i
mytextbox.Text = mytextbox.ID

PlaceHolder1.Controls.Add(mytextbox)
PlaceHolder1.Controls.Add(New LiteralControl("<br>"))

mytextbox.Dispose()

hide.Value = i

End If

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click

i = hide.Value + 1

Dim mytextbox As TextBox
mytextbox = New TextBox
mytextbox.ID = "myTextbox" & i
mytextbox.Text = mytextbox.ID

PlaceHolder1.Controls.Add(mytextbox)
PlaceHolder1.Controls.Add(New LiteralControl("<br>"))

mytextbox.Dispose()

hide.Value = i

End Sub
End Class

4 réponses

Avatar
Zazar
Bonjour,

J'ai un Webform dans lequel j'ai un PlaceHolder, un champ caché et un
bouton. Au chargement de la page, je crée un nouveau textbox que je
place dans mon PlaceHolder.

J'aimerais, lorsque je clique sur mon bouton, ajouter un nouveau
textbox à
la suite de celui créé précédement.

Comment dois-je faire ?

Actuellement lorsque je clique sur mon bouton, ça m'ajoute bien un
nouveau textbox mais en me remplacant le précédent ... :-(((



Si vous créez un contrôle dynamiquement et que vous le rajoutez à un
PlaceHolder, il ne sera pas recréé automatiquement à chaque PostBack. Il
vous faut retenir quels contrôles vous avez créés et les recréer à chaque
fois. Dans votre situation, il vous suffit de retenir le nombre de textbox à
créer (dans le viewstate par exemple) et d'en recréer autant que nécessaire.

--
Zazar
Avatar
Zazar
Bonjour
<snip détails>

Questions :

- Comment faire pour garder en mémoire ce que l'utilisateur a déjà saisi
dans les textbox précédent lorsque celui-ci ajoute un nouveau text box (une
nouvelle formation) ?



Votre problème vient du fait qu'à l'ajout d'un TextBox, vous
reconstruisez tous les TextBox (en détruisant les précédents). Il
faudrait que vous vous contentiez d'en ajouter un. Pour ne pas être
embêté avec la table et le positionner correctement, utilisez le
contrôle Table plutôt que des contrôles de type Literal.
Enfin, dans la méthode de création des TextBox, vous appelez la mét hode
Dispose sur les derniers objets créés : pourquoi ?

- Lorsque je clique sur le bouton "Passer à l'etape suivante", il me fait
une erreur du type "La référence d'objet n'est pas définie à un e instance
d'un objet". Je pense que c'est dû au fait que lorsqu'il y a un postb ack sur
la page et bien tous les textbox sont recréés dynamiquement. Commen t parer
ce problème ?



Avec le détail de l'exception vous pourrez précisément trouver quel est
le contrôle fautif. Cependant vous vous y prenez mal : ce n'est pas à la
page d'aller chercher directement les valeurs parmi les contrôles de
votre UserControl, mais c'est l'UserControl qui doit fournir ces valeurs
par l'intermédiaire d'une méthode. De plus, l'UserControl créant to utes
les textbox, il peut conserver une référence vers chacune des TextBox
(dans un tableau par exemple), il n'a pas besoin d'utiliser Find().

--
Zazar
Avatar
Thibault
Merci pour vos précieuses informations, je vais m'orienter vers le
webcontrol Table.

Maintenant il me vient une question.

J'ai créé une page toute basique avec un webcontrol TABLE vierge (sans
lignes et sans colonnes) et un bouton.

Dans le page_load, je crée une ligne.

Lorsque je clique sur mon bouton je souhaite qu'il m'ajoute une nouvelle
ligne sans me recréer la précédente.

Comment faire pour qu'il garde en mémoire ma première ligne et qu'il
m'ajoute à la suite la nouvelle ?


"Zazar" a écrit dans le message de
news: %
Bonjour
<snip détails>

Questions :

- Comment faire pour garder en mémoire ce que l'utilisateur a déjà saisi
dans les textbox précédent lorsque celui-ci ajoute un nouveau textbox
(une nouvelle formation) ?



Votre problème vient du fait qu'à l'ajout d'un TextBox, vous
reconstruisez tous les TextBox (en détruisant les précédents). Il
faudrait que vous vous contentiez d'en ajouter un. Pour ne pas être
embêté avec la table et le positionner correctement, utilisez le
contrôle Table plutôt que des contrôles de type Literal.
Enfin, dans la méthode de création des TextBox, vous appelez la méthode
Dispose sur les derniers objets créés : pourquoi ?

- Lorsque je clique sur le bouton "Passer à l'etape suivante", il me fait
une erreur du type "La référence d'objet n'est pas définie à une instance
d'un objet". Je pense que c'est dû au fait que lorsqu'il y a un postback
sur la page et bien tous les textbox sont recréés dynamiquement. Comment
parer ce problème ?



Avec le détail de l'exception vous pourrez précisément trouver quel est
le contrôle fautif. Cependant vous vous y prenez mal : ce n'est pas à la
page d'aller chercher directement les valeurs parmi les contrôles de
votre UserControl, mais c'est l'UserControl qui doit fournir ces valeurs
par l'intermédiaire d'une méthode. De plus, l'UserControl créant toutes
les textbox, il peut conserver une référence vers chacune des TextBox
(dans un tableau par exemple), il n'a pas besoin d'utiliser Find().

--
Zazar
Avatar
Zazar
>
J'ai créé une page toute basique avec un webcontrol TABLE vierge (s ans
lignes et sans colonnes) et un bouton.

Dans le page_load, je crée une ligne.

Lorsque je clique sur mon bouton je souhaite qu'il m'ajoute une nouvell e
ligne sans me recréer la précédente.

Comment faire pour qu'il garde en mémoire ma première ligne et qu'i l
m'ajoute à la suite la nouvelle ?



C'est le même problème pour tous les contrôles créés dynamiquem ent : il
faut conserver leurs états. Dans votre situation, le plus simple, c'est
que vous placiez la table et les lignes d'en tête dans votre
.aspx/.ascx, et que vous reteniez le nombre de lignes à créer dans le
ViewState. Ensuite, à chaque rechargement de page, vous recréez toute s
les lignes sauf les entêtes. C'est exactement le même principe que ce
que vous faisiez avec les textbox.


--
Zazar