处理动态加载的用户控件上的事件

时间:2009-07-05 16:21:53

标签: c# asp.net

我有许多页面需要动态加载用户控件并处理它们上的控件上的事件。我在下面的示例代码中包含了一个简单的例子。

Default.aspx的

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <asp:Button ID="BtnLoadControl" runat="server" Text="Load Control 1" 
            onclick="BtnLoadControl_Click" /><br />
    <asp:Button ID="BntLoadControl2" runat="server" Text="Load Control 2" 
            onclick="BntLoadControl2_Click" />
    <asp:PlaceHolder ID="ControlArea" runat="server" />
    </div>
    </form>
</body>
</html>

Deafualt.aspx.cs

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void BtnLoadControl_Click(object sender, EventArgs e)
    {
        Control controlToAdd = Page.LoadControl("~/control1.ascx");
        this.ControlArea.Controls.Add(controlToAdd);
    }
    protected void BntLoadControl2_Click(object sender, EventArgs e)
    {
        Control controlToAdd = Page.LoadControl("~/control2.ascx");
        this.ControlArea.Controls.Add(controlToAdd);
    }
}

Control1.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="control1.ascx.cs" Inherits="control1" %>
<div style="border: 1px solid red;">Test Control
<br /><asp:Button runat="server" ID="testButton" Text="test" onclick="testButton_Click" /></div>

Control1.ascx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class control1 : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void testButton_Click(object sender, EventArgs e)
    {
        Response.Write("Button Clicked on Control 1!");
    }
}

Control2.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Control2.ascx.cs" Inherits="Control2" %>
<div style="border: 1px solid red;">Test Control 2
<br /><asp:Button runat="server" ID="testButton2" Text="test me" 
        onclick="testButton2_Click"  /></div>

Control2.ascx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Control2 : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void testButton2_Click(object sender, EventArgs e)
    {
        Response.Write("Button Clicked on Control 2!");
    }
}

这是展示我想做什么的一个非常简单的例子。我的实际控件更复杂,并且在我加载控件时为设置了几个属性(在default.aspx.cs文件事件处理程序中)。

通过这个例子,当在其中一个加载的控件上单击按钮时,会重新加载页面并且控件不再存在。如何加载控件以及处理控件上发生的任何事件?

1 个答案:

答案 0 :(得分:3)

您问是否可以在页面中加载控件?

您无法在页面中加载控件,因为不存在!它会在每次请求时重新创建。它是从标记(编译与否)以及运行CodeBehind中的任何代码创建的。如果你希望你的控件在PostBack之后存在,那么你需要在PostBack上重新创建它们。如果要处理这些控件上的事件,则在PostBack之后重新创建控件时,必须将控件连接到事件处理程序。然后事件就会发生。