0

default.aspxにあるプレースホルダーにascxカスタムユーザーコントロールを追加/ロードすることで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();            
                }

マスターページ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を呼び出しています。ボタンをクリックすると、ラベルにテキストが再割り当てされるだけで、それぞれに動的に読み込まれるctrlコントロールオブジェクトにボタンとラベルがあります。

そして、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);          
        } 

これまでのところ、すべてが正常に機能しています。NavigationTab_Click関数を呼び出してctrlオブジェクトを読み込んだ後、プレースホルダーにctrlが表示され、ボタンとラベルが表示されますが、このボタンをクリックすると、ラベルがテキストに再割り当てされますが、代わりにCtrlコントロールのコンテンツ全体が消えます。助けてください。

4

1 に答える 1

0

コントロールを動的に追加する場合は、ポストバックごとにコントロールが再作成されるようにする必要があります。また、以前と同じIDを割り当てる必要があります。そうしないと、イベントが正しくトリガーされず、ViewStateから値を再ロードできません。これは、遅くともPage_Loadで実行する必要があります(Page_Initの方が適切です)。

これが、可能な限り動的制御を避ける必要がある理由です。

したがって、これまでと同じように、イベントハンドラーにコントロールを追加できます。ただし、次のポストバックで再作成する必要があります。したがって、what(fe ID)またはすでに作成されているコントロールの数をどこかに保存する必要があります。これは、たとえばViewStateまたはで実行できますSession。次に、適切なIDをコントロールに割り当てることができます(たとえば、インデックスまたはIDの接尾辞が付いています)。

このテーマに関する追加情報は次のとおりです。

于 2012-03-13T17:58:34.620 に答える