事件由一个对象在两个不同的类中触发

时间:2014-02-24 19:59:02

标签: c# .net winforms

我无法弄明白为什么它会这样运作。

我有两个实现接口的类 伪代码

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类中 - 这显然会导致错误,因为它们有不同的实现(但是,调用正确的类来创建图表)

任何人都知道问题出在哪里?

2 个答案:

答案 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()