master页面/ aspx页面如何监听在另一个usercontrol中的usercontrol中调度的事件

时间:2011-09-06 11:57:49

标签: c# asp.net event-handling

我有一个母版页和一个aspx页面。 我希望他们每个人都听一个从内部用户控件调出的事件(意味着一个不在页面本身但在另一个用户控件内的用户控件)?

切换角色会更容易吗?意思是内部控件会通知它的主页面? 我看到了这个: Help with c# event listening and usercontrols

但我认为我的问题更加复杂。

2 个答案:

答案 0 :(得分:0)

尝试使用以下方法:

在UserControl中定义一个事件

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());
        }
    }
}

通过递归控件集合并附加事件处理程序来查找Page / Master Load方法中的UserControl

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;
}

希望这有帮助。

答案 1 :(得分:0)

您可以沿着通过其控件递归的页面路径找到UserControl并附加到它的EventHandler,这是最简单和最直接的方式。

这是一个更多的工作,但我喜欢单个事件总线的想法,您的页面可以用来注册为特定事件的观察者(无论谁发送它)。然后,您的UserControl也可以通过此方式发布事件。这意味着链的两端只依赖于事件(和总线,或者一个接口),而不是特定的发布者/订阅者。

您需要小心线程安全并确保控件正确共享事件总线。我相信ASP.NET WebForms MVP项目采用了这种方法,你可以看一下。