Come posso spostare i controlli in un controllo utente aggiunto dinamicamente nella pagina?
-
05-07-2019 - |
Domanda
Ho un controllo utente che si sposta dinamicamente sul metodo CreateChildControls alcuni controlli web. Quando si utilizza questo controllo in una pagina come:
<myControls:MyUserControl runat="server" ID="myUserControl" />
Funziona perfettamente.
Ma se voglio aggiungere quel controllo utente in modo dinamico in una pagina come:
<asp:UpdatePanel runat="server">
<ContentTemplate>
<asp:PlaceHolder runat="server" ID="plhControls" />
</ContentTemplate>
</asp:UpdatePanel>
<asp:Button runat="server" ID="btnAdd" OnClick="btnAdd_Click" />
.cs
protected void btnAdd_Click(object sender, EventArgs e)
{
MyUserControl myUserControl =(MyUserControl)LoadControl("~/Controls/MyUserControl.ascx");
myUserControl.ID = "test";
plhControls.Controls.Add(myUserControl );
}
Si arresta in modo anomalo all'interno del mio CreateChildControls con errore: la raccolta di controlli non può essere modificata durante le fasi DataBind, Init, Load, PreRender o Unload.
La riga esatta è quando aggiungo i webControls al segnaposto all'interno del mio UserControl:
plhContent.Controls.Add(myWebControl);
Quindi non capisco perché in questo caso non riesco a spostare un controllo web all'interno dell'evento CreateChildControls quando aggiungo UserControl in modo dinamico.
Soluzione
Poiché LoadControl rileva tutti gli eventi del controllo caricato sull'evento corrente, è impossibile eseguire CreateChildControls contemporaneamente al padre poiché l'evento si è già verificato in quel momento.
Nel mio caso non posso aggiungere dinamicamente il mio UserControl, quindi ho fatto il contrario per riprodurre lo stesso comportamento che volevo. Inizializzo tutti i miei controlli e rimuovo quelli che non voglio su OnClick. Questo aggiunge tempo di caricamento non necessario, ma è accettabile nello scenario in cui lo uso.
Altri suggerimenti
I controlli devono essere inizializzati e aggiornati con il resto dei controlli per quanto riguarda il "ciclo di vita della pagina" è preoccupato. Dai un'occhiata al metodo Page.LoadControl e vedi se è possibile creare il tuo controllo prima.
Il metodo che a volte usiamo prevede l'uso di un parametro postback dalla pagina. Non dimenticare che dovrai aggiungere nuovamente il controllo al modulo per ogni postback, poiché non verrà creato per te