Как я могу переместить элементы управления в динамически добавляемый пользовательский элемент управления на страницу?

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

Вопрос

У меня есть 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 и посмотрите, возможно ли создать свой элемент управления ранее.

Метод, который мы иногда используем, включает в себя использование параметра обратной передачи со страницы.Не забывайте, что вам нужно будет повторно добавлять свой элемент управления в форму для каждой обратной отправки, так как он не будет создан для вас

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top