首页 文章

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

提问于
浏览
2

我正在尝试开发一个结果框,当我开始在datagridview中键入单元格时弹出结果框,类似于Chrome在地址栏中输入时所执行的操作 .

我已经完成了大部分工作,我遇到的主要问题是尝试捕获和处理箭头按键(上下) . 我将单元格控件放到一个文本框中,这样我就可以 grab 按键并将它们传递给结果框,这样就可以知道要显示的结果 .

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

    您始终可以扩展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

    尝试使用ff . 事件

    CellBeginEdit - 当您开始在单元格中输入时,此事件将触发, CellEndEdit - 当您在单元格中失去焦点时,此事件将触发, DataError - 如果在数据输入期间发生错误,此事件将触发

相关问题