2012-09-07 66 views
0

这里是我已经设置了结构:如何处理ListView内的UserControl事件?

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

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

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

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

事情我已经尝试:在Usercontrol2

  1. 静态/共享活动......在一个asp.net应用糟糕的主意,显然这些静态事件会越来越混了一些如何,他们在不同的webrequests存在我想。
  2. 向userControl2添加userControl1实例属性(ParentControl1)... asp.net中不允许嵌套UserControls。

感谢您的帮助。

回答

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> 
相关问题