UpdatePanelのカスタムUserControlコンテンツがボタン上で消えます
-
13-12-2019 - |
質問
default.aspx:
にあるPlaceholderでASCXカスタムUserControlを追加/ロードすることで、UpdatePanelコンテンツを更新する次の関数があります。 protected void NavigationTab_Click(string ascxpath)
{
Control ctrl = LoadControl(ascxpath);
//cphmaincontent is my asp ContenPlaceHoderId in masterpage
PlaceHolder phmaincontent = (PlaceHolder)cphmaincontent.FindControl("phmaincontent");
phmaincontent.Controls.Clear();
phmaincontent.Controls.Add(ctrl);
upmaincontent.Update();
}
.
masterpage updatepanel:
<asp:UpdatePanel ID="upmaincontent" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Label ID="lbmsg" runat="server" Text=""></asp:Label>
<asp:ContentPlaceHolder ID="cphmaincontent" runat="server">
</asp:ContentPlaceHolder>
</ContentTemplate>
</asp:UpdatePanel>
.
私は別のカスタムASCXコントロールである私のナビゲーションコントロールからNavigationTab_Clickを呼び出しています。
そして私はASCXコントロールパスを取得するためだけに私のマスターページに次のコードを持っています:
protected override void OnInit(EventArgs e)
{
//raising an event to set ascx path
mainmenu.NavigatePath += new usercontrols.mainmenu.NavigationHandler(NavigationTab_Click);
base.OnInit(e);
}
.
これまでのところすべてがうまく機能します。しかし、代わりにCtrlコントロールの内容全体が消えて、助けてください。
解決
コントロールを動的に追加するときは、すべてのポストバックで再作成されるようにする必要があります。また、以前と同じIDを割り当てる必要があります。そうしないと、イベントは正しくトリガされず、ViewStateから値を再ロードできません。これは最新のPAGE_LOADを実行する必要があります(PAGE_INITの詳細)。
可能な限り動的コントロールを避けるべき理由です。
だからあなたはあなたがやったようなイベントハンドラにコントロールを追加することができます。しかし、彼らは次のポストバックで再現されなければなりません。それで、あなたはどこか(f.e。ids)またはすでに既に作成されているコントロールの数をどこかに保存する必要があります。これは、例えばViewState
またはSession
で行うことができます。次に、適切なIDをコントロールに割り当てることができます(たとえば、インデックスまたはIDの添え字が含まれています)。
この件名に関する追加情報は次のとおりです。
-
表示状態と動的に追加されたコントロール * - asp.netページライフサイクル概要
所属していません StackOverflow