【问题标题】:How to handle UserControl events inside a ListView?如何处理 ListView 中的 UserControl 事件?
【发布时间】:2012-09-07 20:48:09
【问题描述】:

这是我设置的结构:

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

感谢您的帮助。

【问题讨论】:

    标签: asp.net vb.net webforms


    【解决方案1】:

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

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

    • 基本上我的 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 2021-08-16
      • 2013-07-24
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多