2012-02-07 186 views
0

我想从一个类冒泡一个事件到一个自定义用户控件。我的用户控件基本上是一个数据表。Winforms冒泡事件

Sheet 
    -> List<Row> Rows 
    ->List<Cell> Cells 

我的UC(工作表)有一个行(类)列表,每行有一个单元格(类)列表。我的问题是..我怎样才能从单元格中提取事件,表单可以捕获?

回答

0

如果您的单元格知道表单,则可以在表单上引发事件。例如:

{ 
    ... some code ... 
    Sheet.RaiseCellChanged(this.CellId); 
} 

当然,每个单元格必须有一种引用它所在表单的方法(使用上面示例中的Sheet属性)。

另一个更杂乱的选项是让工作表订阅所有单个单元格上的事件。这将是更多的工作,但至少Cell不必知道他们所在的工作表。

编辑: 要回答你的额外问题,性能方面并没有真正的区别。使用第一种方法编写代码会更容易,因为您的Sheet或任何其他对象只需订阅单个事件即可接收来自任何更改单元格的数据(假设这是您想要的) 。

+0

这将工作,如果我有办法引用表..我认为我的工作。但我可以问,表现明智,你给了两个选择之间最好的是什么?.. – noisyass2 2012-02-07 10:26:57

0

在WinForms中实际上不可能冒泡事件,因此您可能需要在图纸级别添加/删除行或单元格的某些功能。

通过补差,以表你将可以在创建/删除订阅/退订从细胞的活动,也将能够从消费者隐藏内部表的结构/创建过程:

public class Sheet 
{ 
    .... 

    public void AddRow(object[] values) 
    { 
     var row = new Row(); 
     foreach(var val in values) 
     { 
      var cell = new Cell(val); 
      cell.CellChanged += MyCellChangedHandler; 
     } 
    } 
} 

public class Cell 
{ 
    .... 

    public Cell(object value) 
    { 
     var eventProvider = value as IMyEventProvider; //can be anything you want, INotifyPropertyChanges? 
     if (eventProvider != null) 
      eventProvider.SomeEvent += SomeEventHandler; 
    } 

    public SomeEventHandler(...) 
    { 
     if (CellChanged != null) CellChanged(...); 
    } 
} 

通过这样做,你将避免细胞知道表单以及如何调用表单和哪些方法等(这显然不是他们关心的问题),单元格只是在事件发生变化时引发事件,如果有人听(表单)他们不关心。