捕捉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事件之前触发的。有东西控制着方向键,但是什么?!

捕捉c#中datagridview单元格中的按键

您始终可以扩展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 -如果在数据输入过程中出现错误