2011-09-06 67 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

相关问题