Как я могу полностью отключить табуляцию в DataGridView, но сохранить возможность выбора строк?


Как я могу полностью отключить табуляцию в DataGridView, чтобы он вообще не проходил через ячейки?

Я использую DataGridView в качестве музыкального плейлиста в своем приложении, и мне не нужна эта раздражающая рамка выбора windows по умолчанию вокруг ячеек. Я хочу иметь возможность нормально выбирать строки. Мне удалось скрыть границу выделения на кнопках с SetStyle (ControlStyles.Выбирается, false), но это не отключает табуляцию в DataGridView.

4 4

4 ответа:

Обрабатывать событие keydown datagridview и позвонить родителю (или деду) управления 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 для параметров направления табуляции и т. д., которые являются тем, что все эти ужасные булевы параметры настраиваются. Первый параметр задает, с которого начинается поиск на вкладке "далее", поэтому вы можете установить его на родителя, брата или бабушку.

Если вы хотите, чтобы DataGrid не фокусировался, вы можете установить свойству it'S Enable значение false, этот элемент управления в форме не фокусируется, но таким образом вы должны добавлять или удалять строки в DataGridView с помощью определенной кнопки (это означает кнопку для добавления и другую для удаления)

Но если вы хотите, чтобы их ячейки не фокусировались, вы должны выполнить следующее: в KeyDown событии вашего form введите этот код

if (e.KeyCode == Keys.Tab)
    {
         dgvMain.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
         [other component of your form like a textbox or a button].Focus();
    }

При этом ваш DataGridView выделит только всю выделенную строку

Хорошо. Мне удалось это сделать. Эта Статья мне очень помогла. Я использовал события 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);
}
Было несколько проблем, которые возникли, когда я пытался заставить его работать, но это другая история. Счастливого кодирования! :)

Вы также можете установить:

dataGridView.TabStop=false;

При нажатии кнопки tab сетка будет пропущена.