声明多个事件处理程序不起作用

时间:2015-01-30 11:58:19

标签: c# asp.net events event-handling

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

我制作了一个测试页面 - 结果是在用户控件上设置的单个处理程序显式有效,但是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;
    }

有关计算返回控件的信息 - 返回计数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));

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

1 个答案:

答案 0 :(得分:1)

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