EditingControlShowing事件使用例-执行Cell的KeyDown事件

//当编辑模式的时候可以触发GridView的KeyDown事件
DataGridView.EditingControlShowing += new System.Windows.Forms.DataGridViewEditingControlShowingEventHandler(DataGridView_EditingControlShowing);

private DataGridViewTextBoxEditingControl EditingControl;
//取得正在编辑中的控件
private void DataGridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
try
{
EditingControl = (DataGridViewTextBoxEditingControl)e.Control;
bool aflg = false;
//获取 DataGridViewTextBoxEditingControl类定义的所有事件的信息
System.Reflection.PropertyInfo pi = (typeof(DataGridViewTextBoxEditingControl)).GetProperty("Events", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
//获取 对象KeyDown的事件处理程序列表
EventHandlerList ehl = (EventHandlerList)pi.GetValue(EditingControl, null);
//获取Control类Click事件的字段信息
System.Reflection.FieldInfo fieldInfo = (typeof(Control)).GetField("EventKeyDown", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
//用获取的KeyDown事件的字段信息,去匹配 对象的事件处理程序列表,获取 对象KeyDown事件的委托对象
//事件使用委托定义的,C#中的委托时多播委托,可以绑定多个事件处理程序,当事件发生时,这些事件处理程序被依次执行
//因此Delegate对象,有一个GetInvocationList方法,用来获取这个委托已经绑定的所有事件处理程序
Delegate d = ehl[fieldInfo.GetValue(null)];

if (d != null)
{
foreach (Delegate del in d.GetInvocationList())
{
//判断一下某个事件处理程序是否已经被绑定到Click事件上
if (del.Method.Name == "EditingControl_KeyDown")
{
aflg = true;
break;
}
}
}
if (aflg == false)
{
EditingControl.KeyDown += new KeyEventHandler(EditingControl_KeyDown);
}
}
catch
{
return;
}
}
//KeyDown事件
private void EditingControl_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.F4)
{
//当按F4的时候
}
}
posted @ 2013-07-29 17:48  Bakuman  阅读(1565)  评论(0)    收藏  举报