我有一个母版页和一个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