2012-04-14 67 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

在您的WebForm中创建一个Property,如下所示。

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'。 – 2012-04-14 13:30:25

+0

什么是错误来了? – Pankaj 2012-04-14 13:37:10

+0

在添加I日志UserSettingsControl(它正在打印对象)之前,我还没有收到任何错误。所以我没有发现错误。 – 2012-04-14 13:44:15

2

你可以只是没有使用占位符,并有有控制的全部时间。然后,linkBut​​ton可以切换控件的可见性。

主要问题是您将控件添加到页面linkBut​​ton单击。当添加到Page_Init和Page_PreInit中时,动态添加的控件效果最佳,这使得它们可以保持其ViewState。还必须在每次回发中将其添加到占位符。如果在您的示例中,另一个控件在将SettingsControl添加到占位符后导致回发,则SettingsControl将消失,因为它不会在每个回发中添加。

相关问题