2

我想按需加载两个用户控件。

 asp:UpdatePanel ID="UpdatePanel1" runat="server"
    ContentTemplate
        asp:Button ID="Button1" runat="server" Text="Button" UseSubmitBehavior="false"
         OnClick="Button1_Click" /
        div id='Div_UserControlPlace' enableviewstate="true" runat="server" 
        /div
    /ContentTemplate
    Triggers
        asp:PostBackTrigger ControlID="Button1" /
    /Triggers
/asp:UpdatePanel
asp:UpdatePanel ID="UpdatePanel2" runat="server"
    ContentTemplate
        asp:Button ID="Button2" runat="server" Text="Button" UseSubmitBehavior="false" 
        OnClick="Button2_Click" /
        div id='Div_UserControlPlace2' enableviewstate="true" runat="server" 
        /div
    /ContentTemplate

aspx.cs

protected void Page_Load(object sender, EventArgs e)
{

}
protected void Button1_Click(object sender, EventArgs e)
{
    Control FeaturedProductUserControl = new Control();
    FeaturedProductUserControl = LoadControl("WebUserControl1.ascx");
    FeaturedProductUserControl.EnableViewState = true;
    Div_UserControlPlace.Controls.Add(FeaturedProductUserControl);
}

protected void Button2_Click(object sender, EventArgs e)
{
    Control FeaturedProductUserControl2 = new Control();
    FeaturedProductUserControl2 = LoadControl("WebUserControl2.ascx");
    FeaturedProductUserControl2.EnableViewState = true;
    Div_UserControlPlace2.Controls.Add(FeaturedProductUserControl2);

}

我通过单击第一个按钮加载第一个用户控件-这可以正常工作,但是当我单击另一个按钮以加载第二个 UserControl 时,第一个 UserControl 消失并且第二个 UserControl 加载。

感谢 IFA_User

4

4 回答 4

3

您应该使用占位符控件将控件动态添加到表单中。

于 2012-07-07T07:03:44.710 回答
1

看看我对动态控件的最后回应:

动态创建的 LinkBut​​tons 的 OnClick 事件不起作用

动态添加的下拉列表不会触发 SelectedIndexChanged 事件

动态创建一个 ImageButton

现在我已经有一些代码用于演示目的,每个动态用户控件在回发中保持其状态

这是输出:

在此处输入图像描述

ASPX

    <asp:PlaceHolder runat="server" ID="addresses" /><br />
    <asp:Button Text="Add Address" runat="server" ID="addAddress" OnClick="addAddress_Click" />

ASPX 代码背后

    protected void Page_PreLoad(object sender, EventArgs e)
    {
        for (int i = 0; i < this.DynamicControlsCount; i++)
        {
            var c = this.LoadControl("~/AddressControl.ascx");
            this.addresses.Controls.Add(c);
        }
    }

    protected void addAddress_Click(object sender, EventArgs e)
    {
        this.DynamicControlsCount++;
        var c = this.LoadControl("~/AddressControl.ascx");
        this.addresses.Controls.Add(c);
    }

    protected int DynamicControlsCount
    {
        get
        {
            if (this.ViewState["ac"] == null)
            {
                return 0;
            }
            return (int)this.ViewState["ac"];
        }
        set
        {
            this.ViewState["ac"] = value;
        }
    }

澳交所

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="AddressControl.ascx.cs" Inherits="WebApplication1.AddressControl" %>

<asp:Panel ID="Panel1" runat="server" GroupingText="Address" DefaultButton="btnSave">
    Street: <asp:TextBox runat="server" ID="txtStreet" /><br />
    City: <asp:TextBox runat="server" ID="txtCity" /><br />
    <asp:Button Text="Save" runat="server" ID="btnSave" OnClick="btnSave_Click" />
</asp:Panel>

<asp:Panel runat="server" GroupingText="Address Summary" Visible="false" ID="summary">
    <asp:Label ID="lblStreet" runat="server" /><br />
    <asp:Label ID="lblCity" runat="server" />
</asp:Panel>

背后的 ASCX 代码

    protected void btnSave_Click(object sender, EventArgs e)
    {
        this.summary.Visible = true;
        this.lblCity.Text = "Selected city: " + this.txtCity.Text;
        this.lblStreet.Text = "Selected street: " + this.txtStreet.Text;
    }
于 2012-07-07T08:46:36.650 回答
0

有几种方法可以做到:

  1. 你可以使用 Ajax 加载用户控件。使用 Ajax 的好处是,您的页面不会被回发,例如,在 Button1 的单击事件中,调用 ajax(traditional/Jquery) 来加载 UserControl1,以及在 Button2 用户控件2 的按钮单击时。

  2. 将这两个按钮放在两个不同的更新面板中,这样做点击事件只会刷新你页面的一部分。

  3. 您必须保存某处(ViewState/Session),单击哪些按钮,并在单击任何按钮时检查该变量的值,并显式加载控件。

注意事项 - 如果您想在您的页面进行完整回发时取回您的数据,那么您必须添加控件,同时牢记页面加载事件周期

于 2012-07-07T08:32:11.863 回答
0

当在 HTML 中创建用户控件时,asp.net 将在回发中持续存在,而无需任何用户交互。但是,如果您以编程方式(动态)加载它们,它们将不会在回发中持续存在。因此,如果您以编程方式加载它们,您还需要以编程方式持久化它们。使用ViewState(或者Session我想)来存储已加载的内容以及可能需要在回发之间加载的任何其他必要信息。每个回发都需要您重新加载每个控件,否则它们将消失。

于 2012-07-07T07:06:22.103 回答