14

我在 winform 上有一个命令按钮。所以,如果我有类似的东西:

myButton.Click += MyHandler1;
myButton.Click += MyHandler2;
myButton.Click += MyHandler3;

如何判断是否已将任何特定的 MyHandler 添加到 Click 事件中,以便不会在我的代码中的其他位置再次添加它?

我已经阅读了如何使用 GetInvocationList() 获取您自己的事件信息。但是在尝试使用各种组合获取命令按钮的项目时出现错误。它说,

“事件 'System.Windows.Forms.Control.Click' 只能出现在 += 或 -= 的左侧。”

我错过了什么?

[编辑] - 我想强调艾哈迈德指出的这个问题。这是一个混乱,应该更容易恕我直言,但看起来它可能只是工作。

4

2 回答 2

12

如果您不确定您的处理程序是否已添加,则只需将其删除并再次添加即可。如果您的处理程序一开始没有添加,则您的删除将被忽略。

myButton.Click -= MyHandler1;
myButton.Click += MyHandler1;

您还可以创建一种附加到事件的方法,并确保代码只运行一次。

private bool handlersAdded;
private void AddHandlers()
{
    if (this.handlersAdded) return;
    myButton.Click += MyHandler1;
    this.handlersAdded = true;
}
于 2010-11-04T07:28:43.407 回答
3

GetIvocationList 的使用只能在事件的所有者(在您的情况下为 myButton)中完成,这是事件背后的想法之一(与委托相反)。

就像 Slugster 说的,你不能从 myButton 外部检查调用列表,但你可以在添加之前尝试删除 MyHandler#。

于 2010-11-04T02:50:04.150 回答