C# 声明多个事件处理程序无效

C# 声明多个事件处理程序无效,c#,asp.net,events,event-handling,C#,Asp.net,Events,Event Handling,我有一个可以包含多个用户控件的页面。每个用户控件至少有一个调用事件的按钮。我想捕捉这些事件 我生成了一个测试页面——结果是,用户控件上的单个处理程序显式设置可以工作,而ForEach不能。代码如下: protected void Page_Load(object sender, EventArgs e) { // This works JumpButton1.HasVisited += new EventHandler(JumpButton_Has

我有一个可以包含多个用户控件的页面。每个用户控件至少有一个调用事件的按钮。我想捕捉这些事件

我生成了一个测试页面——结果是,用户控件上的单个处理程序显式设置可以工作,而ForEach不能。代码如下:

    protected void Page_Load(object sender, EventArgs e)
    {
        // This works
        JumpButton1.HasVisited += new EventHandler(JumpButton_HasVisited);

        // This does not work            
        this.Controls.OfType<JumpButton>()
        .ForEach(uc => uc.HasVisited += new EventHandler(JumpButton_HasVisited));
    }

    void JumpButton_HasVisited(object sender, EventArgs e)
    {
        Label1.Text = "Updated button: " + DateTime.Now;
    }
受保护的无效页面加载(对象发送方,事件参数e)
{
//这很有效
JumpButton1.HasVisited+=新事件处理程序(JumpButton\u HasVisited);
//这行不通
this.Controls.OfType()
.ForEach(uc=>uc.HasVisited+=新事件处理程序(JumpButton_HasVisited));
}
无效跳转按钮\u已访问(对象发送方,事件参数e)
{
Label1.Text=“更新按钮:”+DateTime.Now;
}
有关我计数返回的控件时的信息,返回的计数为1,表示找到了控件

你知道我哪里会出错吗


更新1 下面是一个使用我自己的扩展方法查找控件的示例。我添加了一个检查来查看jumGroup是否包含任何控件,它确实包含。但是,处理程序仍然不会触发

        var jumpGroup = Page.FindControls<JumpButton>();
        foreach (var item in jumpGroup)
        {
            // This shows ID's
            Response.Write(item.ID);
        }

        jumpGroup.ForEach(uc => uc.HasVisited += new EventHandler(JumpGroup_HasVisited));
var jumpGroup=Page.FindControls();
foreach(jumpGroup中的var项)
{
//这是我的身份证
响应。写入(项目ID);
}
jumpGroup.ForEach(uc=>uc.HasVisited+=新事件处理程序(jumpGroup_HasVisited));

更新2 跟踪了问题的根源,但仍然不确定为什么这不起作用。IEnumerable扩展方法出错-当被foreach循环替换时,该方法可以工作

    public static IEnumerable<T> ForEach<T>(this IEnumerable<T> @this, Action<T> action)
    {
        @this.ThrowNull("@this");
        action.ThrowNull("action");

        foreach (T item in @this)
        {
            action(item);
            yield return item;
        }
    }
公共静态IEnumerable ForEach(this IEnumerable@this,Action)
{
@这个.ThrowNull(“@this”);
动作。ThrowNull(“动作”);
foreach(T项在@this中)
{
行动(项目);
收益回报项目;
}
}

实际问题与正在使用的IEnumerable.ForEach()扩展方法有关,该方法未执行操作。修改了扩展方法后,上面的代码现在可以工作。

控件中的控件是否确实属于
JumpButton
类型?您是否有
JumpButton
嵌套在其他控件中,而不是直接嵌套在
页面中?@Michal-是和否。就测试而言,否,在现场,是。我有一个扩展方法,可以进行深入的查找,但我省略了它,以保持对主要问题的关注。但是,当我使用这个代码var jumpGroup=Page.FindControls()时;我肯定会返回控件-我已经遍历了“jumpGroup”并列出了ID's@Lews-是的-请看我对Michal的回复。@MichalHosala-添加了一个updateOK,因此IEnumerable没有ForEach扩展。你能澄清一下这是不是你写的东西吗?(似乎是)是的,这是我写的东西-IEnumerable没有ForEach扩展。发布的代码不起作用,因为yield语句给了它一个不同的目的——删除它,瞧,你有一个工作ForEach。