0

这是我设置的结构:

<UserControl1>
    <ListView>
        <UserControl2 />
        <UserControl2 />
        <UserControl2 />
        <UserControl2 />
    </ListView>
</UserControl2>

当用户在 UserControl2 上单击“编辑”时,我想在 UserControl1 上处理该事件。所以我在 UserControl2 上创建了一个事件,在 ListView DataBind 上的 UserControl1 上添加了一个处理程序,并在单击“编辑”时引发了 UserControl2 事件。

但是当用户单击“编辑”时,整个事情都会发回,并且处理程序会在 UserControl1 上丢失。问题是,我无法在每次回发时重新绑定 ListView,因为重新添加处理程序是一项非常繁重且耗时的操作。

那么如何让 UserControl1 看到 UserControl2 的事件呢?

我尝试过的事情:

  1. Usercontrol2 上的静态/共享事件...在 asp.net 应用程序上是个坏主意,显然这些静态事件会以某种方式混淆起来,我想它们存在于不同的 webrequests 中。
  2. 将 userControl1 实例属性 (ParentControl1) 添加到 UserControl2...asp.net 中不允许嵌套的 UserControl。

谢谢你的帮助。

4

1 回答 1

2

我有一段时间没有做过网络表单了——但我对此很感兴趣。

这三个文件将演示如何使用用户控件订阅事件。

  • 基本上我的 UserControl1 有一个我可以订阅的事件。
  • UserControl2 有一个 ListView,它将包含 UserControl1 的实例。我可以在 UserControl2 中订阅 UserControl1 实例中的事件。
  • Default.aspx 包含 UserControl2 的一个实例

单击 UserControl1 中的任何事件都会触发该事件——在这种情况下,它只会发送 UserControl1 中按钮的文本。

VB 中的代码应该非常相似。

用户控件1

<%@ Control Language="C#" AutoEventWireup="true" %>
<script runat="server">
    public delegate void SillyHandler(object sender, string text);
    public event SillyHandler SomethingHappened;

    public string Name { get; set; }

    protected void Button1_Click(object sender, EventArgs e)
    {
        if (SomethingHappened != null)
            SomethingHappened(this.Button1, this.Button1.Text);
    }
</script>
<asp:Button ID="Button1" runat="server" Text="<%#this.Name %>" onclick="Button1_Click" />

用户控件2

<%@ Control Language="C#" AutoEventWireup="true" %>
<%@ Register src="UserControl1.ascx" tagname="UserControl1" tagprefix="uc1" %>
<script runat="server">
    public List<string> DataSource { get; set; }


    protected void SomethingHappened(object sender, string txt)
    {
        MyLabel.Text = txt;
    }
</script>
<asp:ListView runat="server" ID="ListView1" DataSource="<%#DataSource %>">
    <ItemTemplate>
        <uc1:UserControl1 ID="UserControl11"  runat="server" OnSomethingHappened="SomethingHappened" Name="<%#Container.DataItem %>"/>
    </ItemTemplate>
</asp:ListView>

<asp:Label runat="server" ID="MyLabel" />

默认.aspx

<%@ Page Language="C#" AutoEventWireup="true" %>

<%@ Register src="UserControl2.ascx" tagname="UserControl2" tagprefix="uc1" %>

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!this.IsPostBack)
        {
            this.UserControl21.DataSource = new List<string> { "A", "B", "C" };
            this.UserControl21.DataBind();
        }
    }
</script>

<!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>

        <uc1:UserControl2 ID="UserControl21" runat="server" />

    </div>
    </form>
</body>
</html>
于 2012-09-07T22:40:45.990 回答