2012-04-14 14 views
2

ユーザーコントロールがプレースホルダーに既に追加されている場合は削除され、それ以外の場合は削除されてリンクに追加され、LinkBut​​tonのonclickで行われます。プレースホルダーからのユーザーコントロールの追加と削除

コード:

public partial class SiteSettings : System.Web.UI.Page { 
    private UserSettings UserSettingsControl; 
    protected void Page_Load(object sender, EventArgs e) { 
     System.Diagnostics.Debug.WriteLine("Pageload"); 
     UserSettingsControl = LoadControl("~/UserControls/UserSettings.ascx") as UserSettings; 
    } 

    protected void UserLink_Click(object sender, EventArgs e) {  
     if (SettingsPlaceholder.Controls.Contains(UserSettingsControl)) { 
     System.Diagnostics.Debug.WriteLine("Contains"); 
     SettingsPlaceholder.Controls.Remove(UserSettingsControl); 
     } else { 
     System.Diagnostics.Debug.WriteLine("Does not Contains"); 
     SettingsPlaceholder.Controls.Add(UserSettingsControl); 
     } 
    } 
} 

は、今では動作しません。出力ウィンドウで

Pageload // on first time load 
Pageload // on first time click 
Does not Contains // on first time click 
Pageload // on second time click 
Does not Contains // on second time click 

を取得しています。

どうすればこの問題を解決できますか? ViewStateにも格納しようとしましたが、UserControlは直列化できないため、うまく動作しませんでした。

aspxページは次のとおりです。

<telerik:RadAjaxManager ID="AjaxManager" runat="server"> 
    <AjaxSettings> 
     <telerik:AjaxSetting AjaxControlID="UserLink"> 
      <UpdatedControls> 
       <telerik:AjaxUpdatedControl ControlID="SettingsPanel" LoadingPanelID="LoadingPanel" UpdatePanelRenderMode="Block" /> 
       <telerik:AjaxUpdatedControl ControlID="PlaceHolderPanel" /> 
      </UpdatedControls> 
     </telerik:AjaxSetting>    
    </AjaxSettings> 
    <ClientEvents OnResponseEnd="respondEnd" /> 
</telerik:RadAjaxManager> 
<asp:Panel ID="SettingsPanel" runat="server"> 
    <telerik:RadSplitter ID="MainSplitter" runat="server" MinHeight="200" Width="100%" 
     OnClientLoaded="splitterLoaded" OnClientResized="splitterLoaded"> 
     <telerik:RadPane ID="LeftPane" runat="server" MaxWidth="250" Width="150" MinWidth="150" CssClass="left-rounded-corner settings-splitter-left"> 
      <asp:Panel runat="server"> 
       <asp:LinkButton ID="UserLink" runat="server" onclick="UserLink_Click" Text="User Settings" />      
      </asp:Panel> 
     </telerik:RadPane> 
     <telerik:RadSplitBar ID="Splitbar" runat="server" CollapseMode="Forward" /> 
     <telerik:RadPane ID="RightPane" runat="server" CssClass="right-rounded-corner settings-splitter-right"> 
      <asp:Panel ID="PlaceHolderPanel" runat="server" Height="100%"> 
       <asp:PlaceHolder runat="server" ID="SettingsPlaceholder" /> 
      </asp:Panel> 
     </telerik:RadPane> 
    </telerik:RadSplitter> 
</asp:Panel> 
<telerik:RadAjaxLoadingPanel ID="LoadingPanel" runat="server" /> 

編集:

修正コード:

public partial class SiteSettings : System.Web.UI.Page { 

      protected void Page_Load(object sender, EventArgs e) { 
        if (!IsPostBack) { 
         AddUserSettings(); 
        } 
      } 

      public UserControl UserSettingsControl { 
        get { 
          if (ViewState["UserSettings"] == null) { 
            ViewState["UserSettings"] = LoadControl("~/UserControls/UserSettings.ascx") as UserSettings; 
          } 
          return (UserControl)ViewState["UserSettings"]; 
        } 
      } 

     public UserControl SpaceSettingsControl { 
       get { 
         if (ViewState["SpaceSettings"] == null) { 
           ViewState["SpaceSettings"] = LoadControl("~/UserControls/SpaceSettings.ascx") as SpaceSettings; 
         } 
         return (UserControl)ViewState["SpaceSettings"]; 
       } 
     } 

     protected void SettingsLink_OnCommand(object sender, CommandEventArgs commandEventArgs) { 
       switch (commandEventArgs.CommandName) { 
        case "User": 
          AddUserSettings(); 
          break; 

        case "Space": 
          AddSpaceSettings(); 
          break; 
       } 
     } 

     private void AddUserSettings() { 
       AddSettings(UserSettingsControl); 
     } 

     private void AddSpaceSettings() { 
       AddSettings(SpaceSettingsControl); 
     } 

     private void AddSettings(UserControl control) { 
       SettingsPlaceholder.Controls.Add(control); 
     } 
} 

答えて

2

WebFormPropertyを以下のように作成します。

public UserSettings UserSettingsControl 
{ 
    get 
    { 
     if (Session["MyControl"] == null) 
      Session["MyControl"] = 
      LoadControl("~/UserControls/UserSettings.ascx") as UserSettings; 
     return (UserSettings)Session["MyControl"]; 
    } 
} 

UserSettingsControlのメモリにアクセスできるようになりました。それはPostbackを越えて続くので。元のコードではUserSettingsControlPostBackにヌルにリセットされていました。ランタイム で作成されたすべてのコントロールが配置されますPage Life Cycleの終わりまでに


。最後に、Postbackの後に実行時に 実行時に作成されたコントロールが見つかりません。同じコントロールのレクリエーションのみがPostBackには が必要です。

+0

このプロセスは 'UserSettingsControl'をまったく追加しません。 –

+0

エラーはどうなりますか? – Pankaj

+0

オブジェクトを印刷しているUserSettingsControlをログに記録する前に、私はエラーも表示されません。だから私はエラーを見つけることができませんでした。 –

2

あなただけのプレースホルダを使用していないし、そこに全体の時間を制御している可能性があり。次に、linkBut​​tonはコントロールの可視性を切り替えることができます。

主な問題は、コントロールをページに追加することです。linkBut​​tonをクリックします。動的に追加されたコントロールは、Page_InitとPage_reInitに追加すると、ViewStateを維持することができます。また、すべてのポストバック時にプレースホルダに追加する必要があります。あなたの例では、プレースホルダにSettingsControlが追加された後に別のコントロールがポストバックを引き起こすと、SettingsControlはすべてのポストバックに追加されないため消えます。

関連する問題