如何完全禁用 DataGridView 上的选项卡但保持选择行的能力?

Kar*_*llo 5 c# datagridview tab-ordering tabindex winforms

如何完全禁用 DataGridView 上的选项卡,使其根本不会穿过单元格?

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

Sta*_*eck 5

处理 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这将导致整个网格的行为类似于文本框和按钮之间的 Tab 键切换 - 您按 Tab 键进入网格,再次按 Tab 键将跳出并转到下一个控件。这保留了通过光标键在网格内进行的导航。有关选项卡方向等的选项,请参阅链接的 MSDN 文档,这些选项是所有那些可怕的布尔参数配置的。第一个参数设置控制“下一个”选项卡搜索的开始位置,因此您可以将其设置为父母、兄弟姐妹或祖父母。


Kar*_*llo 0

好的。我已经成功做到了。这篇文章对我帮助很大。我使用表单的 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);
}
Run Code Online (Sandbox Code Playgroud)

当我试图使其工作时出现了一些问题,但那是不同的故事。快乐编码!:)

  • 那篇文章需要注意:**钩子并不是解决你的编程问题**。 (4认同)