Bonjour.

J'ai un formulaire qui doit récupérer une liste de messages depuis une base données. Une fois ces messages récupérés, je dois créer (dynamiquement) autant de UserControl qu'il y a de messages. Chaque UserControl possède une boite de texte et un bouton 'SAVE'.

Lorsque la page se charge, je créer NB UserControl, génère un nouvel ID pou chacun, sauvegarde les IDs dans le ViewState et enfin je les ajoute dans un PlaceHolder. Bon ! Jusqu'ici tout va très bien, les controles s'affichent et avec les bonnes valeurs. Où le problème survient c'est ici :

Lors d'un PostBack je re-créer chacun des UC dans le PlaceHolder, et ensuite l'événement OnClick du UC est excéuté, mais le PlaceHolder est à présent VIDE ! Pourquoi ???

Voilà un peu de code du formulaire :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
 
private void Page_Load(object sender, System.EventArgs e)
{
	// Postback ?
	if (!IsPostBack)
	{
		// Création des boite de messages
		ArrayList Component_Name = new ArrayList( ColApp.Count );
		this.m_CommentsList.Controls.Clear();
		int i = 0;
		foreach( CMessage p in m_MessageList )
		{
			// Créer un UC
			UCMessage newBox = (PCPComments)this.LoadControl( "WUC/UCMessage.ascx" );
			newBox.EnableViewState = true;
 
			// Valeur du message
			newBox.Message = p;
 
			// ID de la Boite
			newBox.ID = "Message_Box_" + (++i);
 
			// Sauvegarder le nom de ce UC
			Component_Name.Add( newBox.ClientID );
 
			// Ajouter ce UC au PlaceHolder
			m_PlaceHolderMessage.Controls.Add( newBox );
		}
		ViewState.Add( "COMPONENT_NAME_COMMENTS", (ArrayList)Component_Name );
	}
	else
	{
		// Re-créer et réassigner les valeur à l'aide du Viewstate bag
		ArrayList Component_Name = (ArrayList)ViewState["COMPONENT_NAME_COMMENTS"];
		if (Component_Name != null && Component_Name.Count > 0)
		{
			for (int i = 0; i < Component_Name.Count; ++i)
			{
				UCMessage p = (UCMessage)this.LoadControl( "WUC/UCMessage.ascx" );
				p.EnableViewState = true;
 
				// Add control to the placeholder
				m_PlaceHolderMessage.Controls.Add( p );
 
				// ID du UC
				p.ID = (string)Component_Name[i];
 
				// Valeur du message
				p.Message = m_MessageList[i];
			}
		}
	}
}

Dans le WebUser control (rien de palpitant...) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
private void m_Bt_Save_Click(object sender, System.EventArgs e)
{
    // Mise à jour du message depuis la boite de text
}
 
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
	InitializeComponent();
	base.OnInit(e);
}
 
private void InitializeComponent()
{
	this.Load += new System.EventHandler(this.Page_Load);
	this.m_bt_Save.Click += new System.EventHandler( this.m_Bt_Save_Click );
}
#endregion

Un gros merci pour votre aide parce que c'est le délire !