做了个公用的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 函数,但是参数不知如何获取, 搞不定啊
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 函数,但是参数不知如何获取, 搞不定啊
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所有的事件
你可以参考下
大致改下应该就可以了
你可以使用复数形式的Get方法
然后查看其中的字符串
比如GetProperties或者GetFields
每次都是这样操作的话
直接用-=就可以了pView.CustomInsert -= new CustomInsertArgsHandle(BMainTransformerTapPosRTInsert);
pView.CustomInsert += new CustomInsertArgsHandle(BMainTransformerTapPosRTInsert); 没必要那么复杂
事件是通过函数触发的, 这个函数是窗体按钮调用的, 也就是说,如果按你的方法取出来的是窗体按钮的事件, 而不是分页控件中自定义事件啊 pView.CustomInsert += new CustomInsertArgsHandle(BMainTransformerTapPosRTInsert); // 该代码是在窗体查询按钮中的, pView.LoadFirstRecord(); //该函数会触发事件咋办 ?
FieldInfo fi = (typeof(Control)).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
----------》
我只是给你个例子
并不是要你去原封不动的使用我这个例子是清除Button的事件
你只是清除CustomInsert 事件
举一反三不会么???
我这里反射Button的Click事件
你反射SplitListViewCtrl的CustomInsert事件就可以了至于说GetField第一个参数怎么指定
我不是说了么
如果Events和EventClick这种字符串不知道
你可以使用复数形式的Get方法
然后查看其中的字符串
比如GetProperties或者GetFields
使用GetFields看看都有哪些你需要的