我正处于测试项目的阶段,并且正在处理将事件处理程序多次附加到按钮的问题。
我有一个带有_btnSelecteProj字段的类,该类通过InitProjects方法中的参数分配按钮引用。
Public Void InitProjects (Button btnSelectProject)
{
_btnSelecteProj = btnSelectProject;
_btnSelecteProj.MouseClick += BtnSelectProj_MouseClick;
}
此方法在运行时中多次调用,因此事件处理程序被分配了多次,我需要防止这种情况。
我意识到这是一个错误的设计。但是,由于我处于测试阶段,因此无法重构整个项目。我在代码中的多个地方都遇到了这个问题。
我试图通过这种方式防止出现此问题:
_btnSelectedProj.MouseClick -= BtnSelectProj_MouseClick;
_btnSelectedProj.MouseClick += BtnSelectProj_MouseClick;
但这不起作用。
我感谢任何建议。
答案 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
此方法在对象生命周期的尽头运行。
注意:我不确定这个问题/答案是否对其他人有用...