[C#] User Control dynamic
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:
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:
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 ! :f1: