Vie*_*urs 7 .net datagridview keyboard-events
我需要在DataGridView控制单元格编辑期间接收按键事件.
根据我在网上找到的内容,DataGridView它旨在将所有关键事件传递DataGridView给单元格编辑控件,您无法轻松获取这些事件.
我发现这段代码会捕获这些事件以进行DataGrid控制,但这不起作用DataGridView.
终于想通了。这个难题有两个部分 - 从单元格编辑控件获取键和从 DataGridView 本身获取键。这是我的代码。要使用它,您只需订阅自定义事件:keyPressHook。
class KeyPressAwareDataGridView : DataGridView
{
protected override void OnControlAdded(ControlEventArgs e)
{
this.subscribeEvents(e.Control);
base.OnControlAdded(e);
}
protected override void OnControlRemoved(ControlEventArgs e)
{
this.unsubscribeEvents(e.Control);
base.OnControlRemoved(e);
}
protected override bool ProcessDataGridViewKey(KeyEventArgs e)
{
bool procesedInternally = false;
if (this.keyPressHook != null)
{
this.keyPressHook(this, e);
procesedInternally = e.SuppressKeyPress;
}
if (procesedInternally)
{
return true;
}
else
{
return base.ProcessDataGridViewKey(e);
}
}
private void subscribeEvents(Control control)
{
control.KeyDown += new KeyEventHandler(this.control_KeyDown);
control.ControlAdded += new ControlEventHandler(this.control_ControlAdded);
control.ControlRemoved += new ControlEventHandler(this.control_ControlRemoved);
foreach (Control innerControl in control.Controls)
{
this.subscribeEvents(innerControl);
}
}
private void unsubscribeEvents(Control control)
{
control.KeyDown -= new KeyEventHandler(this.control_KeyDown);
control.ControlAdded -= new ControlEventHandler(this.control_ControlAdded);
control.ControlRemoved -= new ControlEventHandler(this.control_ControlRemoved);
foreach (Control innerControl in control.Controls)
{
this.unsubscribeEvents(innerControl);
}
}
private void control_ControlAdded(object sender, ControlEventArgs e)
{
this.subscribeEvents(e.Control);
}
private void control_ControlRemoved(object sender, ControlEventArgs e)
{
this.unsubscribeEvents(e.Control);
}
private void control_KeyDown(object sender, KeyEventArgs e)
{
if (this.keyPressHook != null)
{
this.keyPressHook(this, e);
}
}
public event KeyEventHandler keyPressHook;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20198 次 |
| 最近记录: |