请教高手:
比如自定义复合控件中有一个TextBox和一个DataGridView,现在我的自定义控件中就没有DataGridView的事件了,我要怎么把这些事件也加到复合控件中去呢?高手请指教!

解决方案 »

  1.   

    在复合控件中声明相应的事件:
    public event DataGridViewCellEventHandler CellClick;
    复合控件的构造函数()
    {
     DataGridView.CellClick+=delegate(object sender,DataGridViewCellEventArgs e)
    {
       OnCellClick(e);
    };
    }protected virtual void OnCellClick(DataGridViewCellEventArgs e)
    {
    DataGridViewCellEventHandler dg=CellClick;
    if(dg!=null)
    {
      dg(this,e);
    }
    }
      

  2.   

    2楼的不错,就是代理模式的思想另外说一句,你要是嫌麻烦,想偷懒,直接弄个DataGridView属性让外部可以访问就得了毕竟DataGridView那么多的事件,一个个的写起来很累啊要不你再用反射写个代码生成器,直接生成一下吧
      

  3.   

    好的,我明天用lianshaohua 和 agentianle的方法都试下。
      

  4.   

    在复合控件中声明DataGridView对应的事件,注意委托签名要保持一致。
    然后在DataGridView的对应事件中触发复合控件的对应事件。
      

  5.   

    shaohua的方法太好了,我搞定了,讓我又學到了不少。哈哈
      

  6.   


    方法还不算太好,因为事件中与DataGridView的事件参数耦合到一起了,一般来讲这么做可行,但如果将DataGridView控件换成其它的控件(ListView)时,你就惨了,所有订阅事件的地方全都要改,这时为了消除这种情,你需要自己定义事件参数(即不要使用DataGridViewCellEventArgs而是重新定义自己的事件参数,事件参数中的数据从DataGridViewCellEventArgs实例中取得,这样当你包装的DataGridView更改时,只需要更改你本控件内部的OnCellClick()方法即可,你控件外部无须做任何更改;
    这样做的工作量太大,有时就偷懒按下面的方法做,
    ***************************************************************************************
    在复合控件中声明相应的事件: 
    public event DataGridViewCellEventHandler CellClick; 
    复合控件的构造函数() 

    DataGridView.CellClick+=delegate(object sender,DataGridViewCellEventArgs e) 

    OnCellClick(e); 
    }; 
    } protected virtual void OnCellClick(DataGridViewCellEventArgs e) 

    DataGridViewCellEventHandler dg=CellClick; 
    if(dg!=null) 

    dg(this,e);