2009-03-06 2 views
2

У меня есть usercontrol, которые динамически перемещаются по методу CreateChildControls с помощью некоторых веб-элементов управления. При использовании этого элемента управления на страницу, как:Как я могу перемещать элементы управления в динамически добавленный usercontrol на страницу?

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

Он работает безупречно.

Но если я хочу добавить, что UserControl динамически на страницу, как:

<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 динамически.

ответ

1

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

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

0

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

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

+0

К сожалению, я не могу создать свой контроль раньше, из-за предыдущего перемещения управления. и поэтому я не могу использовать параметры для обратной передачи. –

Смежные вопросы