Как я могу переместить элементы управления в динамически добавляемый пользовательский элемент управления на страницу?
-
05-07-2019 - |
Вопрос
У меня есть usercontrol, который динамически перемещает с помощью метода CreateChildControls некоторые веб-элементы управления.При использовании этого элемента управления на странице, подобной :
<myControls:MyUserControl runat="server" ID="myUserControl" />
Это работает безупречно.
Но если я хочу динамически добавить этот пользовательский элемент управления на страницу, например :
<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 );
}
Он выходит из строя внутри моего CreateChildControls с ошибкой :Коллекция элементов управления не может быть изменена на этапах привязки данных, инициализации, загрузки, предварительного просмотра или выгрузки.
Точная строка - это когда я добавляю WebControls в заполнитель внутри моего UserControl :
plhContent.Controls.Add(myWebControl);
Поэтому я не понимаю, почему в этом случае я не могу переместить веб-элемент управления внутри события CreateChildControls, когда я добавляю свой UserControl динамически.
Решение
Поскольку LoadControl преобразует каждое событие загруженного элемента управления в текущее событие, невозможно запустить CreateChildControls одновременно с родительским, поскольку событие уже произошло ed в то время.
В моем случае я не могу динамически добавлять свой UserControl, поэтому я сделал обратное, чтобы воспроизвести то же поведение, которое я хотел.Я инициализирую все свои элементы управления и удаляю те, которые мне не нужны OnClick.Это увеличивает ненужное время загрузки, но это приемлемо в том сценарии, который я использую.
Другие советы
Элементы управления должны быть инициализированы и приведены в соответствие с остальными элементами управления в том, что касается "жизненного цикла страницы".Взгляните на страницу.Метод LoadControl и посмотрите, возможно ли создать свой элемент управления ранее.
Метод, который мы иногда используем, включает в себя использование параметра обратной передачи со страницы.Не забывайте, что вам нужно будет повторно добавлять свой элемент управления в форму для каждой обратной отправки, так как он не будет создан для вас