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

У меня есть 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 с ошибкой: коллекцию элементов управления нельзя изменить на этапах DataBind, Init, Load, PreRender или Unload.

Точная строка - когда я добавляю webControls к заполнителю внутри моего UserControl:

plhContent.Controls.Add(myWebControl);

Поэтому я не понимаю, почему в этом случае я не могу переместить веб-элемент управления внутри события CreateChildControls, когда я динамически добавляю свой UserControl.

Ответы [ 2 ]

1 голос
/ 09 марта 2009

Поскольку LoadControl перехватывает каждое событие загруженного элемента управления до текущего события, невозможно запускать CreateChildControls одновременно с родительским, так как событие уже произошло в то время.

В моем случае я не могу динамически добавить свой UserControl, поэтому я сделал наоборот, чтобы воспроизвести то же поведение, которое я хотел. Я инициализирую все свои элементы управления и удаляю те, которые мне не нужны, OnClick. Это добавляет ненужное время загрузки, но это допустимо в сценарии, в котором я его использую.

0 голосов
/ 07 марта 2009

Элементы управления должны быть инициализированы и приведены в соответствие с остальными элементами управления в отношении «жизненного цикла страницы». Посмотрите на метод Page.LoadControl и посмотрите, возможно ли создать элемент управления ранее.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...