Come posso spostare i controlli in un controllo utente aggiunto dinamicamente nella pagina?

StackOverflow https://stackoverflow.com/questions/620684

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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top