如何按需加载两个ASP.NET UserControl?

时间:2012-07-07 06:59:17

标签: asp.net c#-4.0 user-controls web-user-controls dynamic-usercontrols

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

 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 个答案:

答案 0 :(得分:3)

您应该使用Placeholder control动态地将控件添加到表单中。

答案 1 :(得分:1)

看看我上次关于动态控件的回复:

OnClick event of dynamically created LinkButtons is not working

Dynamically Added DropDownlists Are Not Firing SelectedIndexChanged Event

Dynamically create an ImageButton

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

这是输出:

enter image description here

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

ASCX

<%@ 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;
    }

答案 2 :(得分:0)

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

答案 3 :(得分:0)

有几种方法可以做到:

  1. 你可以使用Ajax加载UserControls。使用Ajax的好处是,ur页面不会回发,因此例如,在Button1的click事件上,调用ajax(传统/ Jquery)加载UserControl1,并在按钮上单击Button2 User control2。

    < / LI>
  2. 将两个按钮放在两个不同的更新面板中,通过执行此操作,点击事件将只刷新您页面的一部分。

  3. 你必须保存某个地方(ViewState / Session),单击哪些按钮,点击任何按钮后检查该变量的值,并显式加载控件。

  4. 注意事项 - 如果你想在你的页面完成回发时获取你的数据,那么你必须添加控件,记住页面加载事件周期