컨트롤을 동적으로 추가 된 USERCONTROL로 이동하려면 어떻게해야합니까?

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

문제

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 또는 언로드 단계에서 제어 컬렉션을 수정할 수 없습니다.

정확한 라인은 usercontrol 내부의 자리 표시 자에 웹을 추가 할 때입니다.

plhContent.Controls.Add(myWebControl);

그래서이 경우 UserControl을 동적으로 추가 할 때 CreateChildControls 이벤트 내에서 웹 컨트롤을 이동할 수없는 이유를 이해하지 못합니다.

도움이 되었습니까?

해결책

LoadControl은 현재 이벤트에로드 된 제어의 모든 이벤트를 잡기 때문에, 그 당시 ED가 이미 ED가 발생한 이후로 CreateChildControls를 부모와 동시에 실행하는 것은 불가능합니다.

내 경우에는 동적으로 내 우르 컨트롤을 추가 할 수 없으므로 원하는 동일한 동작을 재현하기 위해 반대를 수행했습니다. 모든 컨트롤을 초기화하고 on 클릭을 원하지 않는 컨트롤을 제거합니다. 이로 인해 불필요한로드 시간이 추가되지만 사용하는 시나리오에서는 허용됩니다.

다른 팁

"페이지 수명주기"에 관한 한 컨트롤을 초기화하고 나머지 컨트롤과 속도를 높이기 위해 제기해야합니다. Page.LoadControl 메소드를 살펴보고 일찍 컨트롤을 만들 수 있는지 확인하십시오.

우리가 때때로 사용하는 방법은 페이지의 Postback 매개 변수를 사용하는 것입니다. 당신을 위해 만들어지지 않기 때문에 모든 Postback의 FOT 양식에 컨트롤을 다시 추가해야한다는 것을 잊지 마십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top