2

一部のWebコントロールをCreateChildControlsメソッド上で動的に移動するユーザーコントロールがあります。このコントロールを次のようなページに使用する場合:

<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の各フェーズではコントロールコレクションを変更できません。

正確な行は、UserControl内のプレースホルダーにwebControlsを追加したときです。

plhContent.Controls.Add(myWebControl);

そのため、この場合、UserControlを動的に追加すると、CreateChildControlsイベント内でWebコントロールを移動できない理由がわかりません。

4

2 に答える 2

1

LoadControl は、ロードされたコントロールのすべてのイベントを現在のイベントにキャッチアップするため、イベントがその時点ですでに発生しているため、CreateChildControls を親と同時に実行することはできません。

私の場合、UserControl を動的に追加することはできないため、同じ動作を再現するために反対のことを行いました。すべてのコントロールを初期化し、OnClick に不要なものを削除します。これにより不要なロード時間が追加されますが、私が使用するシナリオでは許容されます。

于 2009-03-09T18:39:28.773 に答える
0

「ページのライフサイクル」に関する限り、コントロールを初期化し、残りのコントロールに合わせて調整する必要があります。Page.LoadControl メソッドを見て、以前にコントロールを作成できるかどうかを確認してください。

私たちが時々使用する方法には、ページからのポストバック パラメーターの使用が含まれます。コントロールは作成されないため、ポストバックごとにフォームにコントロールを再度追加する必要があることを忘れないでください。

于 2009-03-07T01:03:08.393 に答える