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);
        }
}
4

2 に答える 2

2

PlaceHolderを使用して、常にそこを制御することはできません。次に、linkBut​​tonはコントロールの表示を切り替えることができます。

主な問題は、ページのlinkBut​​tonクリックにコントロールを追加していることです。動的に追加されたコントロールは、Page_InitおよびPage_PreInitに追加すると最適に機能します。これにより、ViewStateを維持できます。また、すべてのポストバックでプレースホルダーに追加する必要があります。この例で、SettingsControlがプレースホルダーに追加された後に別のコントロールがポストバックを引き起こす場合、すべてのポストバックに追加されているわけではないため、SettingsControlは表示されなくなります。

于 2012-04-14T13:07:29.347 に答える
2

以下のようにを作成PropertyしますWebForm

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

これで、のメモリにアクセスできますUserSettingsControl。全体で持続するためPostback。元のコードでは、は。UserSettingsControl全体でnullにリセットされていましPostBackた。


Page Life Cycle実行時に作成されたすべてのコントロールが終了するまでに破棄されます。最後に、実行時に作成されたコントロールが。の後に見つかりませんPostback。それぞれに同じコントロールの再作成のみが必要になりますPostBack

于 2012-04-14T13:13:39.063 に答える