我无法弄明白为什么它会这样运作。
我有两个实现接口的类 伪代码
Public Interface IChart
{
void Show()
void Hide()
}
public class DailyChart: IChart
{
/***/
public DailyChart(chartControl, Id)
{
chartControl.CustomDraw += new CustomDrawEvent(/**/)
}
}
public class WeeklyChart: IChart
{
public WeeklyChart(chartControl, Id)
{
chartControl.CustomDraw += CustomDrawEvent(/**/)
}
然后以winforms形式声明一个对象
IChart object
然后我使用组合框在运行时在图表之间切换,就像
object = new Weeklychart(chartControl, id)
或
object = new DailyChart(chartControl, id)
然后是神奇的 我运行app,从Weekly切换到Daily,然后切换到Weekly,这会导致错误。我调试了应用程序并发现,CustomDrawEvent同时在BOTH类中 - 这显然会导致错误,因为它们有不同的实现(但是,调用正确的类来创建图表)
任何人都知道问题出在哪里?
答案 0 :(得分:0)
在向图表添加新事件之前,您需要删除旧图像:
chartControl.CustomDraw -= yourOldEvent;
chartControl.CustomDraw += yourNewEvent;
或者您可以阅读此问题以删除所有控制事件: How to remove all event handlers from a control
答案 1 :(得分:0)
* 强文 *你遇到的问题是.Net中的事件可以拥有无限数量的处理程序(这就是为什么你设置和取消设置+ = / - =而不仅仅是=),并且您将同一个chartControl对象传递给两个类。
您需要取消订阅该事件或创建一个新的chartControl实例。
修改强>
取消订阅活动可能会非常棘手。每个对象都可以取消订阅自己,但不能取消订阅其他对象,即WeeklyChart的实例不能取消订阅DailyChart,甚至不能取消订阅WeeklyChart的其他实例。
你可以做的是在WeeklyChart和DailyChart中制作一个方法“Unsubscribe”,你可以从你在哪里制作/切换这些对象来调用该对象。
这样的事情:
public class DailyChart: IChart
{
/***/
public DailyChart(chartControl, Id)
{
chartControl.CustomDraw += new CustomDrawEvent(/**/);
}
public Unsubscribe()
{
chartControl.CustomDraw -= new CustomDrawEvent(/**/);
}
}
public class WeeklyChart: IChart
{
public WeeklyChart(chartControl, Id)
{
chartControl.CustomDraw += CustomDrawEvent(/**/);
}
public Unsubscribe()
{
chartControl.CustomDraw -= new CustomDrawEvent(/**/);
}
}
因此,无论何时制作任何一个实例,都要先清理旧的实例:
mychart = new WeeklyChart(chartControl, Id);
// Do stuff...
myChart.Unsubscribe();
myChart = new MonthlyChart(chartControl, Id);
或者只需实施IDisposable
并将其移除Dispose()
。