2011-09-06 47 views
1

我有一個母版頁和一個aspx頁面。 我希望他們每個人都聽一個從內部用戶控件(不是在頁面本身,而是在另一個用戶控件中的用戶控件)分派的事件?主頁面/ aspx頁面如何監聽在另一個usercontrol內的usercontrol中分派的事件

轉換角色會更容易嗎?這意味着內部控制會通知它的主頁面? 我看到這個: Help with c# event listening and usercontrols

但我的問題是更復雜,我認爲。

回答

0

您可以沿着通過其控件遞歸的頁面的路徑找到UserControl並附加到它的EventHandler,這是最簡單和最直接的方式。

這是一個更多的工作,但我喜歡單個事件總線的想法,您的網頁可以用來註冊爲特定事件的觀察者(不管是誰發送它)。你的UserControl可以通過這個發佈事件。這意味着鏈條的兩端僅取決於事件(以及公交車或一個接口),而不是特定的發佈者/訂閱者。

您需要注意線程安全並確保您的控件正確共享事件總線。我相信ASP.NET WebForms MVP項目採用這種方法,你可以看看。

0

嘗試使用以下方法:

在您的用戶控件定義事件

public delegate void UserControl2Delegate(object sender, EventArgs e); 

public partial class UserControl2 : System.Web.UI.UserControl 
{ 
    public event UserControl2Delegate UserControl2Event; 

    //Button click to invoke the event 
    protected void Button_Click(object sender, EventArgs e) 
    { 
     if (UserControl2Event != null) 
     { 
      UserControl2Event(this, new EventArgs()); 
     } 
    } 
} 

通過遞歸的控件集合和附加的事件處理程序查找您的頁/主負載方法的用戶控件

UserControl2 userControl2 = (UserControl2)FindControl(this, "UserControl2"); 
userControl2.UserControl2Event += new UserControl2Delegate(userControl2_UserControl2Event); 

... 

void userControl2_UserControl2Event(object sender, EventArgs e) 
{ 
    //Do something   
} 

... 

private Control FindControl(Control parent, string id) 
{ 
    foreach (Control child in parent.Controls) 
    { 
     string childId = string.Empty; 
     if (child.ID != null) 
     { 
      childId = child.ID; 
     } 

     if (childId.ToLower() == id.ToLower()) 
     { 
      return child; 
     } 
     else 
     { 
      if (child.HasControls()) 
      { 
       Control response = FindControl(child, id); 
       if (response != null) 
        return response; 
      } 
     } 
    } 

    return null; 
} 

希望這個hel PS。

+0

我會盡力的。 「委託」和「eventHandler」有什麼區別? –

+0

委託本質上是一個指向方法的指針。代表聲明定義了它可以指向的方法簽名。這種情況下的方法是事件處理程序,當從UserControl2調用事件時它將被觸發。我不會詳細解釋事件+代表,因爲下面的文章比我更好地解釋它:[事件和代表簡化](http://www.codeproject.com/KB/cs/events.aspx) – jdavies

相關問題