Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 母版页/aspx页如何侦听在另一个usercontrol内部的usercontrol中调度的事件_C#_Asp.net_Event Handling - Fatal编程技术网

C# 母版页/aspx页如何侦听在另一个usercontrol内部的usercontrol中调度的事件

C# 母版页/aspx页如何侦听在另一个usercontrol内部的usercontrol中调度的事件,c#,asp.net,event-handling,C#,Asp.net,Event Handling,我有一个母版页和一个aspx页。 我想让它们中的每一个都侦听从内部用户控件发送的事件,这意味着用户控件不在页面本身中,而是在另一个用户控件中 转换角色会更容易吗?意味着内部控制将通知其母版页? 我看到了: 但我认为我的问题更复杂。尝试使用以下方法: 在UserControl中定义事件 通过递归controls集合并附加事件处理程序,在页面/主加载方法中查找UserControl 希望这能有所帮助。您可以沿着页面通过其控件递归的路线找到UserControl并连接到它的EventHandler,

我有一个母版页和一个aspx页。 我想让它们中的每一个都侦听从内部用户控件发送的事件,这意味着用户控件不在页面本身中,而是在另一个用户控件中

转换角色会更容易吗?意味着内部控制将通知其母版页? 我看到了:


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

尝试使用以下方法:

在UserControl中定义事件

通过递归controls集合并附加事件处理程序,在页面/主加载方法中查找UserControl


希望这能有所帮助。

您可以沿着页面通过其控件递归的路线找到UserControl并连接到它的EventHandler,这是最简单、最直接的方法

这需要更多的工作,但我喜欢单一事件总线的想法,您的页面可以使用它注册为特定事件的观察者,而不管是谁发送的。然后,您的UserControl还可以通过此发布事件。这意味着链的两端仅依赖于事件和总线,或其中一个的接口,而不是特定的发布者/订阅者


您需要注意线程安全,并确保控件正确共享事件总线。我相信这个项目采用了这种方法,你可以看看。

我会试试。委托和eventHandler之间的区别是什么?委托本质上是指向方法的指针。委托声明定义了它可以指向的方法签名。本例中的方法是事件处理程序,它在从UserControl2调用事件时被激发。我不会太详细地解释events+委托,因为下面的文章比我解释得更好:
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;
}