¿Cómo puedo mover controles a un control de usuario agregado dinámicamente a la página?

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

Pregunta

Tengo un control de usuario que se mueve dinámicamente en el método CreateChildControls con algunos controles web. Al usar este control en una página como:

<myControls:MyUserControl runat="server" ID="myUserControl" />

Funciona perfectamente.

Pero si quiero agregar ese UserControl dinámicamente en una página como:

<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 );
}

Se bloquea dentro de mis CreateChildControls con error: la colección de control no se puede modificar durante las fases DataBind, Init, Load, PreRender o Unload.

La línea exacta es cuando agrego webControls al marcador de posición dentro de mi UserControl:

plhContent.Controls.Add(myWebControl);

Entonces no entiendo por qué en este caso no puedo mover un control web dentro del evento CreateChildControls cuando agrego mi UserControl dinámicamente.

¿Fue útil?

Solución

Dado que LoadControl atrapa todos los eventos del control cargado al evento actual, es imposible ejecutar CreateChildControls al mismo tiempo que el principal, ya que el evento ya se produjo en ese momento.

En mi caso, no puedo agregar dinámicamente mi UserControl, así que hice lo contrario para reproducir el mismo comportamiento que quería. Inicializo todos mis controles y elimino los que no deseo OnClick. Esto agrega tiempo de carga innecesario, pero es aceptable en el escenario en que lo uso.

Otros consejos

Los controles deben inicializarse y actualizarse con el resto de los controles hasta el "ciclo de vida de la página". se preocupa Eche un vistazo al método Page.LoadControl y vea si es posible crear su control antes.

El método que a veces usamos implica el uso de un parámetro de devolución de la página. No olvide que deberá volver a agregar su control al formulario para cada devolución de datos, ya que no se creará para usted

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top