コントロールをページに動的に追加されたユーザーコントロールに移動するにはどうすればよいですか?
-
05-07-2019 - |
質問
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メソッドを見て、以前にコントロールを作成できるかどうかを確認してください。
私たちが時々使用する方法では、ページからポストバックパラメーターを使用します。ポストバックのたびにコントロールをフォームに再追加する必要があることを忘れないでください。コントロールは作成されないためです