声明多个事件处理程序不起作用
Declaring multiple event handlers does not work
我有一个可以包含多个用户控件的页面。每个用户控件至少有一个调用事件的按钮。我想捕捉这些事件。
我制作了一个测试页 - 结果是在用户控件上显式设置的单个处理程序有效,但 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;
}
}
实际问题与正在使用的 IEnumerable.ForEach() 扩展方法有关,该方法未执行操作。修改了扩展方法后,上面的代码现在可以工作了。
我有一个可以包含多个用户控件的页面。每个用户控件至少有一个调用事件的按钮。我想捕捉这些事件。
我制作了一个测试页 - 结果是在用户控件上显式设置的单个处理程序有效,但 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;
}
}
实际问题与正在使用的 IEnumerable.ForEach() 扩展方法有关,该方法未执行操作。修改了扩展方法后,上面的代码现在可以工作了。