Delegate class has a GetInvocationList() method, but for an event, it is only valid inside the class where the event is declared, so you probably have to use Reflection>>>>但是我想在删除之前先给个体是,如果用户选yes,就删除,否则就不删see FAQ5.58 How can I put up a confirmation question when the user tries to delete a row in the datagrid by clicking on the row header and pressing the Delete key? http://www.syncfusion.com/FAQ/WindowsForms/FAQ_c44c.aspx#q889q
>>>>我服了楼上的扫描功能,见了他的好多回复都是连接这就是差距亚
试一下类似下面的编码using System.Reflection; .... CheckEventHandlers("EventKeyDown",dataGrid1); static void CheckEventHandlers(string EventObjectName, Control c) { //get the key into the EventHandlerList Object key=null; FieldInfo fikey = typeof(Control).GetField(EventObjectName,BindingFlags.Static|BindingFlags.NonPublic); if (fikey != null) key = fikey.GetValue(null); FieldInfo fi = typeof(System.ComponentModel.Component).GetField("events",BindingFlags.Instance|BindingFlags.NonPublic);
if (fi != null) { Object eventlist = fi.GetValue(c); FieldInfo fi2 = eventlist.GetType().GetField("head",BindingFlags.Instance|BindingFlags.NonPublic); if (fi2 != null) { Object head = fi2.GetValue(eventlist);
while (true) { object ekey = GetObjectField(head,"key");
object handler = GetObjectField(head,"handler"); if (ekey == key) {
//we found Delegate g = (Delegate)handler; foreach (Delegate dg in g.GetInvocationList()) Console.WriteLine("{0}={1}", dg.Target.GetType().Name, dg.Method.Name); break; } object next = GetObjectField(head,"next"); if (next == null) break; head = next; } } } }static object GetObjectField(object o, string name) { FieldInfo fi = o.GetType().GetField(name,BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.Public); if (fi != null) return fi.GetValue(o); return null; }
除非你给事件加上add 和 remove 访问器。
比如说datagrid,当我选中一行时,我可以点击delete键删除,但是我想在删除之前先给个体是,如果用户选yes,就删除,否则就不删。
我在datagrid的onKeyDown事件里写代码,弹出MessageBox,但是在弹出MessageBox之前,datagrid的那一行就被删除了。请问我想实现上述功能,该怎么做。前面问得问题就是想看看这个datagrid的OnKeyDown事件到底绑定了几个方法,都是些什么方法,然后看看能不能改写这些方法。达到我的目的
我不知道用什么事件处理你的问题,但是我做过数据回滚,接近你要的。
对象被绑定到DataGrid时,DataGrid自动把事件连接到被绑定的对象。
http://www.syncfusion.com/FAQ/WindowsForms/FAQ_c44c.aspx#q889q
....
CheckEventHandlers("EventKeyDown",dataGrid1);
static void CheckEventHandlers(string EventObjectName, Control c)
{
//get the key into the EventHandlerList
Object key=null;
FieldInfo fikey = typeof(Control).GetField(EventObjectName,BindingFlags.Static|BindingFlags.NonPublic);
if (fikey != null)
key = fikey.GetValue(null); FieldInfo fi = typeof(System.ComponentModel.Component).GetField("events",BindingFlags.Instance|BindingFlags.NonPublic);
if (fi != null)
{
Object eventlist = fi.GetValue(c);
FieldInfo fi2 = eventlist.GetType().GetField("head",BindingFlags.Instance|BindingFlags.NonPublic);
if (fi2 != null)
{
Object head = fi2.GetValue(eventlist);
while (true)
{
object ekey = GetObjectField(head,"key");
object handler = GetObjectField(head,"handler");
if (ekey == key)
{
//we found
Delegate g = (Delegate)handler;
foreach (Delegate dg in g.GetInvocationList())
Console.WriteLine("{0}={1}", dg.Target.GetType().Name, dg.Method.Name);
break;
} object next = GetObjectField(head,"next");
if (next == null)
break; head = next;
} }
}
}static object GetObjectField(object o, string name)
{
FieldInfo fi = o.GetType().GetField(name,BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.Public); if (fi != null)
return fi.GetValue(o); return null;
}