コントロールをページに動的に追加されたユーザーコントロールに移動するにはどうすればよいですか?

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

質問

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

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

plhContent.Controls.Add(myWebControl);

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

役に立ちましたか?

解決

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

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

他のヒント

コントロールは初期化され、「ページライフサイクル」が終了するまで、残りのコントロールと同じ速度で起動する必要があります。心配です。 Page.LoadControlメソッドを見て、以前にコントロールを作成できるかどうかを確認してください。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top