如何在ListView中处理UserControl事件?

时间:2012-09-07 20:48:10

标签: asp.net vb.net webforms

这是我设置的结构:

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

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

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

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

我尝试过的事情:

  1. Usercontrol2上的静态/共享事件...在asp.net应用程序上的坏主意,显然这些静态事件会混淆一些,我想它们存在于不同的Web请求中。
  2. 将userControl1实例属性(ParentControl1)添加到UserControl2 ... asp.net中不允许嵌套的UserControl。
  3. 感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

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

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

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

单击UserControl1中的任何事件将触发事件 - 在这种情况下,只发送UserControl1中按钮的文本。

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

的UserControl1

<%@ 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" />

UserControl2

<%@ 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" />

Default.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>