【发布时间】:2012-02-07 10:11:46
【问题描述】:
我想将一个事件从一个类冒泡到一个自定义用户控件。 我的用户控件基本上是一个数据表。
Sheet
-> List<Row> Rows
->List<Cell> Cells
我的 UC(Sheet) 有一个 Rows(Class) 列表,每行都有一个 Cells(Class) 列表。我的问题是..我如何从工作表可以捕获的单元格中引发事件?
【问题讨论】:
我想将一个事件从一个类冒泡到一个自定义用户控件。 我的用户控件基本上是一个数据表。
Sheet
-> List<Row> Rows
->List<Cell> Cells
我的 UC(Sheet) 有一个 Rows(Class) 列表,每行都有一个 Cells(Class) 列表。我的问题是..我如何从工作表可以捕获的单元格中引发事件?
【问题讨论】:
如果您的单元格知道工作表,则它们可以在工作表上引发事件。例如:
{
... some code ...
Sheet.RaiseCellChanged(this.CellId);
}
当然,每个单元格都必须有一种方法来引用它所在的工作表(在上面的示例中使用 Sheet 属性)。
另一个更混乱的选项是让工作表订阅所有单个单元格上的事件。这将是更多的工作,但至少单元格不必知道它们所在的工作表。
编辑: 要回答您的其他问题,在性能方面并没有真正的区别。使用第一种方法编写代码会更容易,这也是因为您的工作表(或任何其他对象)只需订阅一个事件即可从任何更改的单元格接收数据(假设这是您想要的) .
【讨论】:
在 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(...);
}
}
通过这样做,您将避免单元格知道工作表以及如何调用工作表以及哪些方法等(显然不是他们关心的问题),单元格只会在它们发生变化时引发事件,如果有人听(工作表)他们不听'不在乎。
【讨论】: