【问题标题】:Issue with dynamically loading a user control on button click单击按钮时动态加载用户控件的问题
【发布时间】:2010-04-05 17:38:29
【问题描述】:

我有一个页面,我在其中动态加载用户控件,如下所示:

Default.aspx:

    <cc1:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server">
    </cc1:ToolkitScriptManager>

    <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>

Default.aspx.cs:

    protected void Page_Load(object sender, EventArgs e)
    {
        var ctrl = LoadControl("~/UserCtrl1.ascx");
        ctrl.ID = "ucUserCtrl1";
        PlaceHolder1.Controls.Add(ctrl);
    }

下面是UserCtrl1.ascx的代码

<asp:Label ID="Label1" runat="server"></asp:Label>
<asp:Button ID="Button1" runat="server" Text="Button1" OnClick="Button1_Click" />
<br />
<asp:PlaceHolder ID="PlaceHolder2" runat="server"></asp:PlaceHolder>

单击 Button1 时,我正在动态加载另一个用户控件

UserCtrl1.ascx.cs

    protected void Button1_Click(object sender, EventArgs e)
    {
        Label1.Text = "UserControl - 1 button clicked!";

        var ctrl = LoadControl("~/UserCtrl2.ascx");
        ctrl.ID = "ucUserCtrl2";
        PlaceHolder2.Controls.Add(ctrl);
    }

下面是 UserCtrl2.ascx 的标记

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <asp:Label ID="Label2" runat="server"></asp:Label>
        <asp:Button ID="Button2" runat="server" Text="Button2" OnClick="Button2_Click" />
    </ContentTemplate>
</asp:UpdatePanel>

UserCtrl2.ascx.cs

    protected void Button2_Click(object sender, EventArgs e)
    {
        Label2.Text = "UserControl - 2 button clicked!";
    }

当我单击 UserCtrl1 中的 Button1 时页面加载后,单击事件会触发,我可以看到 Label1 文本。它还正确加载了 UserCtrl2,但是当我单击 UserCtrl2 中的 Button2 时,单击事件会触发,更糟糕的是,当我单击 Button2 两次时,UserCtrl2 控件会从页面中消失。我怎样才能解决这个问题?

【问题讨论】:

    标签: c# asp.net user-controls


    【解决方案1】:

    第二个控件的问题是您仅在单击按钮 1 后才加载它。但是当发生其他一些(不是单击按钮 1)回发时,您的第二个控件不会加载。

    其中一个可能的修复方法是保存一些标志(例如在 ViewState 中),这将帮助您确定是否应加载第二个控件(并在页面加载时加载)。

    protected void Button1_Click(object sender, EventArgs e)
    {
        Label1.Text = "UserControl - 1 button clicked!";
    
        var ctrl = LoadControl("~/UserCtrl2.ascx");
        ctrl.ID = "ucUserCtrl2";
        PlaceHolder2.Controls.Add(ctrl);
    
        this.SecondControlLoaded = true; // This flag saves to ViewState that your control was loaded.
    }
    
    protected void Page_Load(object sender, EventArgs e)
    {
        var ctrl = LoadControl("~/UserCtrl1.ascx");
        ctrl.ID = "ucUserCtrl1";
        PlaceHolder1.Controls.Add(ctrl);
    
        if (this.SecondControlLoaded)
        {
            var ctrl = LoadControl("~/UserCtrl2.ascx");
            ctrl.ID = "ucUserCtrl2";
            PlaceHolder2.Controls.Add(ctrl);
        }
    }
    

    【讨论】:

    • 能否请您发布完整的代码?我猜 SecondControlLoaded 是 UserCtrl1 中的一个布尔属性,它将值保存到视图状态。但是您如何访问 Default.aspx.cs 上的这个值?而且 PlaceHolder2 也不是 Default.aspx。
    • 不用担心,我想通了。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 2018-02-14
    相关资源
    最近更新 更多