我怎样才能完全禁用DataGridView上的Tab键但保留选择行的能力?

时间:2014-08-09 22:37:35

标签: c# winforms datagridview tabindex tab-ordering

如何完全禁用DataGridView上的Tab键,以便它根本不会通过单元格?

我在我的应用程序中使用DataGridView作为音乐播放列表,并且我不需要在单元格周围使用恼人的Windows默认选择框架。我希望能够正常选择行。我设法使用SetStyle(ControlStyles.Selectable,false)隐藏按钮上的选择边框,但这不会禁用DataGridView上的Tab键。

4 个答案:

答案 0 :(得分:4)

处理DataGridView的KeyDown事件并调用父(或祖父母)控件的SelectNextControl方法。

private void dataGridView1_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键将标签输出到下一个控件上。这通过光标键保留网格内的导航。有关选项卡方向的选项,请参阅链接的MSDN文档,这些是所有这些可怕的布尔参数配置的选项。第一个参数设置控制" next"选项卡搜索从开始,因此您可以将其设置为父级或兄弟或祖父母。

答案 1 :(得分:0)

如果你想让DataGrid不集中,你可以将它的Enable属性设置为false,表单上的这个控件不会得到焦点,但是这样你必须在DataGridView中添加或删除行特定按钮(表示添加按钮,删除按钮)

但是如果您希望他们的细胞无法聚焦,您应该遵循以下步骤:在KeyDown的{​​{1}}事件中,输入此代码

form

有了这个,你的DataGridView只突出显示整个选定的行

答案 2 :(得分:0)

行。我设法做到了。这ARTICLE给了我很多帮助。我使用form的OnActivated和OnDeactivated事件来禁用和启用TAB键。这里有示例代码:

protected override void OnActivated(EventArgs e) {

    ProcessModule objCurrentModule = Process.GetCurrentProcess().MainModule;
    objKeyboardProcess = new LowLevelKeyboardProc(captureKey);
    ptrHook = SetWindowsHookEx(13, objKeyboardProcess, GetModuleHandle(objCurrentModule.ModuleName), 0);

    base.OnActivated(e);
}

protected override void OnDeactivate(EventArgs e) {

    UnhookWindowsHookEx(ptrHook);
    objKeyboardProcess = null;
    ptrHook = IntPtr.Zero;

    base.OnDeactivate(e);
}

当我试图让它发挥作用时,出现了一些问题,但这是一个不同的故事。快乐的编码! :)

答案 3 :(得分:0)

您也可以设置:

dataGridView.TabStop=false;

当按下标签按钮时,这将跳过网格。