首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Winforms冒泡事件

Winforms冒泡事件
EN

Stack Overflow用户
提问于 2012-02-07 18:11:46
回答 2查看 1.2K关注 0票数 0

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

代码语言:javascript
复制
Sheet
  -> List<Row> Rows
   ->List<Cell> Cells

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-07 18:18:36

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

代码语言:javascript
复制
{
   ... some code ...
   Sheet.RaiseCellChanged(this.CellId);
}

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

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

EDIT:回答你的额外问题,从性能上来说并没有什么不同。使用第一种方法编写代码会更容易,因为您的工作表--或任何其他对象--只需订阅一个事件,即可从任何变化的单元格接收数据(假设这就是您想要的)。

票数 0
EN

Stack Overflow用户

发布于 2012-02-07 18:23:52

在WinForms中不可能冒泡事件,因此您可能需要在工作表级别上使用一些功能来添加/删除行或单元格。

通过将其添加到工作表中,您将能够在创建/删除单元格时订阅/取消订阅单元格中的事件,还可以对使用者隐藏内部工作表的结构/创建过程:

代码语言:javascript
复制
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),他们并不关心。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9174371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档