Como posso mover controles para um userControl dinamicamente adicionado para a página?
-
05-07-2019 - |
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.
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ê