做了个公用的listview分页控件, 但出了点问题, 请教一下控件中定义委托
    public delegate void CustomInsertArgsHandle(object sender, CustomInsertArgs e);
控件中定义事件参数
    public class CustomInsertArgs : EventArgs
    {
        private List<object> message;        ListViewEx _View = null;
        public CustomInsertArgs(List<object> message, ListViewEx pView)
        {            this.message = message;
            this._View = pView;
        }        public List<object> Data
        {            get { return message; }
        }        public ListViewEx View
        {
            get { return _View; }
        }
    } 
分页控件加入了事件
   public partial class SplitListViewCtrl : UserControl
    {
        ListViewEx _pView = null;        List<object> _DataBuffer = new List<object>();
        List<object> _pCurrentShowData = new List<object>();
        int _PageSize = 0;        int m_iPageCount = 0;
        int index = 0;        public event CustomInsertArgsHandle CustomInsert;
}调用控件窗体
       private void BMainTransformerTapPosRTQuery(object oQueryCondition, SplitListViewCtrl pView, GVMSDeviceShareData pShareData)
        {
            IDevRunRecordQueryCommand<IMainTransformerTapPosRecord> pQueryResult = pShareData.SysSrvPack.RunRecordSrv.CreateRunRecordQueryCommand<IMainTransformerTapPosRecord>();            pQueryResult.QueryString = CreateQueryString(oQueryCondition);            List<IMainTransformerTapPosRecord> pDevNameList = pQueryResult.Query();            pView.DataBuffer.Clear();
            for (int i = 0; i < pDevNameList.Count; i++)
            {
                pView.DataBuffer.Add(pDevNameList[i] as object);
            }            // 添加事件处理函数时我想全部清空处理函数列表, 不知道怎么做!  处理函数列表是可能会很多            pView.CustomInsert += new CustomInsertArgsHandle(BMainTransformerTapPosRTInsert);            pView.LoadFirstRecord();
        }描述:
我在增加事件处理函数时想清空委托列表, 但是pView.CustomInsert 委托列表不知道如何获取, 请高手指点一下哈, 先谢谢了.
MSDN上说可以用 Delegate.RemoveAll 函数,但是参数不知如何获取, 搞不定啊

解决方案 »

  1.   


    PropertyInfo pi = (typeof(System.Windows.Forms.Button)).GetProperty("Events",
                    BindingFlags.Instance | BindingFlags.NonPublic);
    EventHandlerList ehl = (EventHandlerList)pi.GetValue(button1, null);
    FieldInfo fi = (typeof(Control)).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
    Delegate d = ehl[fi.GetValue(null)];
    if (d != null)
    {
        System.Delegate[] dels = d.GetInvocationList();
        for (int i = 0; i < dels.Length; i++)
        {
            this.button1.Click -= (EventHandler)dels[i];
        }
    }这个例子是移除button1所有的事件
    你可以参考下
    大致改下应该就可以了
      

  2.   

    如果Events和EventClick这种字符串不知道
    你可以使用复数形式的Get方法
    然后查看其中的字符串
    比如GetProperties或者GetFields
      

  3.   

    另外如果你pView.CustomInsert += new CustomInsertArgsHandle(BMainTransformerTapPosRTInsert); 
    每次都是这样操作的话
    直接用-=就可以了pView.CustomInsert -= new CustomInsertArgsHandle(BMainTransformerTapPosRTInsert); 
    pView.CustomInsert += new CustomInsertArgsHandle(BMainTransformerTapPosRTInsert); 没必要那么复杂
      

  4.   

    lovefootball 
        事件是通过函数触发的, 这个函数是窗体按钮调用的, 也就是说,如果按你的方法取出来的是窗体按钮的事件, 而不是分页控件中自定义事件啊            pView.CustomInsert += new CustomInsertArgsHandle(BMainTransformerTapPosRTInsert);  // 该代码是在窗体查询按钮中的,             pView.LoadFirstRecord();  //该函数会触发事件咋办 ?
      

  5.   

    想用你的代码试了一下, 请问GetField第一个参数怎么指定?
    FieldInfo fi = (typeof(Control)).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
      

  6.   

    如果按你的方法取出来的是窗体按钮的事件, 而不是分页控件中自定义事件啊 
    ----------》
    我只是给你个例子
    并不是要你去原封不动的使用我这个例子是清除Button的事件
    你只是清除CustomInsert 事件
    举一反三不会么???
    我这里反射Button的Click事件
    你反射SplitListViewCtrl的CustomInsert事件就可以了至于说GetField第一个参数怎么指定
    我不是说了么
    如果Events和EventClick这种字符串不知道 
    你可以使用复数形式的Get方法 
    然后查看其中的字符串 
    比如GetProperties或者GetFields
    使用GetFields看看都有哪些你需要的