在c#中的datagridview单元格中捕获按键

时间:2014-03-17 23:59:13

标签: c# datagridview keydown keyup key-events

我正在尝试开发一个结果框,当我开始在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事件。有东西处理那个箭头键,但是什么?!

2 个答案:

答案 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 - 如果在数据输入期间发生错误,则会触发此事件