如何防止将事件处理程序多次附加到按钮?

时间:2019-11-26 08:47:37

标签: c# winforms events delegates

我正处于测试项目的阶段,并且正在处理将事件处理程序多次附加到按钮的问题。

我有一个带有_btnSelecteProj字段的类,该类通过InitProjects方法中的参数分配按钮引用。

Public Void InitProjects (Button btnSelectProject)
{
        _btnSelecteProj = btnSelectProject;
        _btnSelecteProj.MouseClick += BtnSelectProj_MouseClick;
}

此方法在运行时中多次调用,因此事件处理程序被分配了多次,我需要防止这种情况。

我意识到这是一个错误的设计。但是,由于我处于测试阶段,因此无法重构整个项目。我在代码中的多个地方都遇到了这个问题。

我试图通过这种方式防止出现此问题:

_btnSelectedProj.MouseClick -= BtnSelectProj_MouseClick;
_btnSelectedProj.MouseClick += BtnSelectProj_MouseClick;

但这不起作用。

我感谢任何建议。

3 个答案:

答案 0 :(得分:0)

在您的事件中,您可以将添加/删除操作实现为显式方法,并检查事件处理程序中add是否为空。

答案 1 :(得分:0)

例如,您可以检查_btnSelecteProj的值是否已更改

public void InitProjects(Button btnSelectProject)
{
    if (_btnSelecteProj != null)
    {
        if (_btnSelecteProj.Equals(btnSelectProject))
            return;
        _btnSelecteProj.MouseClick -= BtnSelecteProj_MouseClick;
    }
    _btnSelecteProj = btnSelectProject;
    _btnSelecteProj.MouseClick += BtnSelecteProj_MouseClick;
}

答案 2 :(得分:0)

我必须添加方法ClearEventHandlers()并以适当方式删除事件处理程序。

SELECT * FROM TABLE WHERE NAME LIKE 'ann%' OR NAME LIKE '%ann%' 
ORDER BY CASE
    WHEN Name LIKE 'ann%' THEN 1 
    WHEN Name LIKE '%ann%' THEN 2 
    ELSE 3 
END

此方法在对象生命周期的尽头运行。

注意:我不确定这个问题/答案是否对其他人有用...

相关问题