【问题标题】:Winforms Bubbling EventsWinforms 冒泡事件
【发布时间】:2012-02-07 10:11:46
【问题描述】:

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

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

我的 UC(Sheet) 有一个 Rows(Class) 列表,每行都有一个 Cells(Class) 列表。我的问题是..我如何从工作表可以捕获的单元格中引发事件?

【问题讨论】:

    标签: c# .net winforms c#-4.0


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 如果我有办法引用工作表,这将起作用。我认为我会努力解决这个问题。但是我可以问一下,在性能方面,您提供的两个选项之间有什么更好的选择??..
    【解决方案2】:

    在 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(...);
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 2012-09-30
      • 1970-01-01
      • 2011-10-20
      • 2011-08-23
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多