none
子控件事件映射到主控件 RRS feed

  • 问题

  • 我创建了两个自定义控件:Cell和Chest,Chest中有一个TableLayoutPanel控件,当改变该控件的RowCount或ColumnCount时,先清空TLP控件中的所有Cell控件,然后重新向TLP的每个单元格中添加一个Cell控件。

    Cell控件包含一个ContextMenuStrip控件,该控件中包含两个Item,一个对应Cell的Open事件(自定义),另一个对应Cell的Release事件(自定义)

    Chest控件也包含一个ContextMenuStrip控件,该控件中也包含两个Item,一个对应Chest的OpenAllCell事件(自定义),另一个对应Chest的ReleaseAllCell事件(自定义)

    需要在向TLP控件中逐个添加Cell控件时,向Cell的ContextMenuStrip控件添加Chest的ContextMenuStrip的两个Item。最后需要Chest中的每个Cell控件的Open事件映射到Chest控件,这里应该需要再在Chest中自定义两个事件。

    请问如何实现以上功能,谢谢。

    2014年4月25日 3:53

答案

  • 我用委托的方法实现了,跟你分享一下。

    我是用快捷菜单对Cell进行操作,不能直接使用你的代码,因为你的Cell_Open中的sender就是ContextMenuItem,不是cell,所以可能导致错误。

    如果不是使用快捷菜单操作,而是直接使用Cell的事件,那你的代码就没有问题

    //下面两行代码是在Chest中创建cell时的代码

    Cell cell = new Cell();

    cell.Open += delegate(object obj, EventArgs e) { OpenCurrentCell(e, cell); };

    //定义事件,在使用Chest控件的程序中使用

    public event EventHandler OpenCell;

    private void OpenCurrentCell(EventArgs e, Cell cell)

    {

    if(this.OpenCell != null)

    this.OpenCell(cell, e);

    }


    2014年4月28日 3:22

全部回复

  • "向Cell的ContextMenuStrip控件添加Chest的ContextMenuStrip的两个Item“这是什么意思呢?把Chest的ContextMenuStrip的两个Item添加到Cell的ContextMenuStrip控件后,Chest的ContextMenuStrip的那两个item就会消失,因为menuitem不能在不同的两个menustrip里面存在。

    关于Chest中的每个Cell控件的Open事件”映射“到Chest控件,可以这样(以下示例代码在Chest中):

    Cell cell = new Cell();
    cell.Open += new EvenHeader(Cell_Open);//Chest在创建cell时,添加对Open事件的处理函数
    
    private void Cell_Open(object sender, EventArgs e)
    {
          if (null != CellOpen)
          {
               CellOpen(sender, e);//在处理函数中,直接产生CellOpen事件既可
          }
    }
    
    public event EventHandler CellOpen;//在Chest里面定义新的事件

    • 已标记为答案 tod-chen 2014年4月28日 3:23
    • 取消答案标记 tod-chen 2014年4月28日 3:27
    2014年4月25日 6:58
  • 我用委托的方法实现了,跟你分享一下。

    我是用快捷菜单对Cell进行操作,不能直接使用你的代码,因为你的Cell_Open中的sender就是ContextMenuItem,不是cell,所以可能导致错误。

    如果不是使用快捷菜单操作,而是直接使用Cell的事件,那你的代码就没有问题

    //下面两行代码是在Chest中创建cell时的代码

    Cell cell = new Cell();

    cell.Open += delegate(object obj, EventArgs e) { OpenCurrentCell(e, cell); };

    //定义事件,在使用Chest控件的程序中使用

    public event EventHandler OpenCell;

    private void OpenCurrentCell(EventArgs e, Cell cell)

    {

    if(this.OpenCell != null)

    this.OpenCell(cell, e);

    }


    2014年4月28日 3:22