我有一個母版頁和一個aspx頁面。 我希望他們每個人都聽一個從內部用戶控件(不是在頁面本身,而是在另一個用戶控件中的用戶控件)分派的事件?主頁面/ aspx頁面如何監聽在另一個usercontrol內的usercontrol中分派的事件
轉換角色會更容易嗎?這意味着內部控制會通知它的主頁面? 我看到這個: Help with c# event listening and usercontrols
但我的問題是更復雜,我認爲。
我有一個母版頁和一個aspx頁面。 我希望他們每個人都聽一個從內部用戶控件(不是在頁面本身,而是在另一個用戶控件中的用戶控件)分派的事件?主頁面/ aspx頁面如何監聽在另一個usercontrol內的usercontrol中分派的事件
轉換角色會更容易嗎?這意味着內部控制會通知它的主頁面? 我看到這個: Help with c# event listening and usercontrols
但我的問題是更復雜,我認爲。
您可以沿着通過其控件遞歸的頁面的路徑找到UserControl並附加到它的EventHandler,這是最簡單和最直接的方式。
這是一個更多的工作,但我喜歡單個事件總線的想法,您的網頁可以用來註冊爲特定事件的觀察者(不管是誰發送它)。你的UserControl可以通過這個發佈事件。這意味着鏈條的兩端僅取決於事件(以及公交車或一個接口),而不是特定的發佈者/訂閱者。
您需要注意線程安全並確保您的控件正確共享事件總線。我相信ASP.NET WebForms MVP項目採用這種方法,你可以看看。
嘗試使用以下方法:
在您的用戶控件定義事件
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。
我會盡力的。 「委託」和「eventHandler」有什麼區別? –
委託本質上是一個指向方法的指針。代表聲明定義了它可以指向的方法簽名。這種情況下的方法是事件處理程序,當從UserControl2調用事件時它將被觸發。我不會詳細解釋事件+代表,因爲下面的文章比我更好地解釋它:[事件和代表簡化](http://www.codeproject.com/KB/cs/events.aspx) – jdavies