2012-09-07 63 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> 
相關問題