我正在尝试开发一个结果框,当我开始在datagridview中输入单元格时弹出结果框,类似于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标志,要么我需要找到在tx_PreviewKeyDown之后但在datagridview_KeyUp事件之前触发的KeyDown事件。有东西处理那个箭头键,但是什么?!
答案 0 :(得分:1)
您始终可以扩展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);
}
}
答案 1 :(得分:0)
尝试使用ff。事件
CellBeginEdit - 当您开始在单元格中输入时,此事件将触发, CellEndEdit - 当您在单元格中失去焦点时,此事件将触发, DataError - 如果在数据输入期间发生错误,则会触发此事件