【发布时间】:2008-11-15 20:18:23
【问题描述】:
我想做这样的事情:
Button btn1 = new Button();
btn1.Click += new EventHandler(btn1_Click);
Button btn2 = new Button();
// Take whatever event got assigned to btn1 and assign it to btn2.
btn2.Click += btn1.Click; // The compiler says no...
btn1_Click 已在类中定义:
void btn1_Click(object sender, EventArgs e)
{
//
}
这当然不会编译(“事件 'System.Windows.Forms.Control.Click' 只能出现在 += 或 -=" 的左侧)。有没有办法从一个控件中获取事件处理程序并在运行时将其分配给另一个控件?如果这不可能,那么复制事件处理程序并在运行时将其分配给另一个控件是否可行?
几点:我已经在谷歌上搜索了一段时间,但还没有找到办法。大多数尝试的方法都涉及反射,因此如果您阅读了我的问题并认为答案非常明显,请先尝试在 Visual Studio 中编译代码。或者,如果答案真的非常明显,请随意给我一巴掌。谢谢,我真的很期待看看这是否可能。
我知道我可以这样做:
btn2.Click += new EventHandler(btn1_Click);
这不是我在这里寻找的。p>
这也不是我要找的:
EventHandler handy = new EventHandler(btn1_Click);
Button btn1 = new Button();
btn1.Click += handy;
Button btn2 = new Button();
btn2.Click += handy;
【问题讨论】:
-
EventHandler btnClick = new EventHandler(btn1_Click); btn1.Click -= btnClick; btn2.Click += btnClick;如果这没有帮助,我不知道我是否明白你想要什么。
-
请注意,从 C# 2 开始,您不需要“new EventHandler(...)” - 只需“EventHandler btnClick = btn1_Click”即可...很少需要“new WhatDelegateType( ...)" 从 C# 2 开始。
-
抱歉,我在 sn-ps 中经常使用 new,所以我可以 TAB TAB。
-
谢谢乔恩。我从上面的示例中复制了代码:)
-
@shahkalpesh:抱歉,我不清楚,但在我的情况下,EventHandler 实际上被分配给不同范围的 btn1,因此它不再被分配给 btn2。有关更多详细信息,请参阅 Jon 的答案中的 cmets。