捕捉c#中datagridview单元格中的按键
本文关键字:datagridview 捕捉 单元格 | 更新日期: 2023-09-27 17:50:46
我正在尝试开发一个当我开始在datagridview中输入cell时弹出的结果框,类似于Chrome浏览器在地址栏中输入时的效果。
我已经完成了大部分,我遇到的主要问题是试图捕获和处理箭头键按压(上下)。我已经将单元格控件设置为一个文本框,这样我就可以抓取按键并将它们传递给结果框,这样它就知道要显示什么结果。
tx.PreviewKeyDown += new PreviewKeyDownEventHandler(tx_PreviewKeyDown);
tx.KeyDown += new KeyEventHandler(tx_KeyDown);
tx.KeyPress += new KeyPressEventHandler(tx_KeyPress);
这一切都很好,问题是,当我按下箭头键,tx_PreviewKeyDown捕获它,然后它消失,直到它在datagridview_KeyUp事件中被捕获,到那时,太晚了,datagridview已经向下移动了活动单元格。
我可以处理tx_PreviewKeyDown中的事件,并将其向下传递以在结果框中移动突出显示的值,但我需要做的是防止它将活动单元格向下移动到新行。
我需要能够取消按键,但PreviewKeyDown没有e.Handle标志,或者我需要找到什么KeyDown事件是在tx_PreviewKeyDown之后但在datagridview_KeyUp事件之前触发的。有东西控制着方向键,但是什么?!
您始终可以扩展DataGridView并使用WndProc方法:
class exDataGridView : DataGridView
{
private const int WM_KEYDOWN = 0x100;
private const int WM_KEYUP = 0x101;
private const int KEYUP = 38;
private const int KEYDOWN = 40;
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_KEYDOWN:
if (m.WParam == (IntPtr)KEYDOWN)
{
// Do key down stuff...
return;
}
else if (m.WParam == (IntPtr)KEYUP)
{
// Do key up stuff...
return;
}
break;
}
base.WndProc(ref m);
}
}
尝试使用ff。事件
CellBeginEdit -当您开始在单元格中输入时,此事件将触发, cellenddit -当您在单元格中失去焦点时,DataError -如果在数据输入过程中出现错误