我想将一个事件从一个类冒泡到一个自定义的Usercontrol。我的Usercontrol基本上就是一个数据表。
Sheet
-> List<Row> Rows
->List<Cell> Cells我的UC(工作表)有一个行列表(Class),每个行都有一个单元格列表(Class)。我的问题是..如何从工作表可以捕获的单元格引发事件?
发布于 2012-02-07 18:18:36
如果您的单元格知道工作表,则它们可以在工作表上引发事件。例如:
{
... some code ...
Sheet.RaiseCellChanged(this.CellId);
}当然,每个单元格都必须有一种方式来引用它所在的工作表(在上面的例子中使用一个sheet属性)。
另一个更混乱的选项是让工作表订阅所有单个单元格上的事件。这将是更多的工作,但至少单元格不必知道它们所在的工作表。
EDIT:回答你的额外问题,从性能上来说并没有什么不同。使用第一种方法编写代码会更容易,因为您的工作表--或任何其他对象--只需订阅一个事件,即可从任何变化的单元格接收数据(假设这就是您想要的)。
发布于 2012-02-07 18:23:52
在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(...);
}
}通过这样做,您将避免单元格知道表以及如何调用sheets和哪些方法,等等(这显然不是他们关心的),单元格只是在它们改变时引发事件,如果有人监听(sheet),他们并不关心。
https://stackoverflow.com/questions/9174371
复制相似问题