【问题标题】:Disable Tab key on datagridview在datagridview上禁用Tab键
【发布时间】:2019-02-14 17:14:57
【问题描述】:

我正在尝试从 datagridview 中禁用 tab 键,同时在其上创建我自己的事件。此外,如果可以禁用上、下、右、左和输入键。 加载事件

this.dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter;

在 KeyDownEvent 上

 private void gridInvoice_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Tab)
        {
            //SelectNextControl(dataGridView1, true, true, true, true);
            // or Parent.SelectNextControl() if the grid is an only child, etc.
            e.Handled = true;
        }

    }

使用 Tab 键上方的代码,它可以工作。我移动到下一个单元格。我怎样才能防止这种情况发生?

【问题讨论】:

  • 因为您有DataGridViewEditMode.EditOnEnter,所以关键事件由 DGV 编辑控件处理:DGV 不会引发 KeyDown/PreviewKeyDown 事件。您可以实现自己的编辑控件。见IDataGridViewEditingControl。但很大程度上取决于您想要覆盖哪些行为以及这些覆盖何时应该处于活动状态。

标签: c# winforms


【解决方案1】:

您必须使用 PreviewKeyDown 事件而不是 KeyDown。

根据Microsoft Control.PreviewKeyDown Event Description

某些按键(例如 TAB、RETURN、ESC 和箭头键)通常会被某些控件忽略,因为它们不被视为输入按键。

如果要在 Tab 按下时使用 KeyDown 事件,则需要在 PreviewKeyDown 事件中插入以下代码。

if (e.KeyCode == Keys.Tab) { e.IsInputKey = true; }

感谢 Jimi 在编辑模式下

对不起,我认为问题太简单了。这个怎么样。当您处于 DGV 的编辑模式时,您可以覆盖 ProcessCmdKey 以忽略 Tab。是不是太粗暴了? 我认为这比制作一个新的编辑控件简单,但也不优雅。

    protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
    {
        if (keyData == Keys.Tab && dataGridView1.EditingControl != null) { return true; }
        else return base.ProcessCmdKey(ref msg, keyData);
    }

来自Similar problem

【讨论】:

  • 订阅PreviewKeyDown 可能是个好主意。但是,哪个控件的PreviewKeyDown 事件?如果您处于编辑模式,DataGridView 可以引发该事件吗?
猜你喜欢
  • 2010-11-30
  • 1970-01-01
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-10
相关资源
最近更新 更多