Como posso mover controles para um userControl dinamicamente adicionado para a página?

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

Pergunta

Eu tenho um UserControl que se move dinamicamente no método CreateChildControls Alguns controles da Web. Ao usar esse controle em uma página como:

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

Funciona perfeitamente.

Mas se eu quiser adicionar esse UserControl dinamicamente em uma 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 );
}

Ele trava dentro do meu createChildControls com erro: a coleção de controle não pode ser modificada durante as fases do banco de dados, init, carga, pré -renda ou descarregamento.

A linha exata é quando eu adiciono os controladores de web ao espaço reservado dentro do meu UserControl:

plhContent.Controls.Add(myWebControl);

Portanto, não entendo por que, neste caso, não posso mover um controle da Web dentro do evento CreateChildControls quando adiciono meu UserControl dinamicamente.

Foi útil?

Solução

Como o LoadControl acompanha todos os eventos do controle carregado no evento atual, é impossível executar os CreateChildControls ao mesmo tempo que os pais desde que o evento já ocorreu naquele momento.

No meu caso, não posso adicionar dinamicamente meu UserControl, então fiz o oposto para reproduzir o mesmo comportamento que queria. Inicializo todos os meus controles e removo aqueles que não quero oClick. Isso adiciona tempo de carregamento desnecessário, mas é aceitável no cenário que eu o uso.

Outras dicas

Os controles devem ser inicializados e aumentados com o restante dos controles no que diz respeito ao "ciclo de vida da página". Dê uma olhada no método Page.loadControl e veja se é possível criar seu controle anteriormente.

O método que às vezes usamos envolve o uso de um parâmetro de postback na página. Não se esqueça de que você precisará re-adquirir seu controle para o formulário de cada postback, pois não será criado para você

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top