С# Winforms Listview - как вы можете осуществлять программный контроль клавиш со стрелками вверх и вниз на клавиатуре?

Я не работал с winforms для многих лун, и когда я был, это было в Visual Basic. В любом случае, у меня есть элемент управления ListView, и я понимаю, что этот элемент управления обрабатывает стрелки вверх и вниз с внутренней стороны клавиатуры, но мне действительно нужно иметь больше контроля над поведением этих клавиш при их нажатии.

Скажем, у нас есть список элементов> A, B, C, D, E, F, G

Основная проблема здесь в том, что кто-то может выделить выделение в списке элементов в моем ListView с помощью мыши. Например, A. Если они удерживают левую кнопку мыши и перетаскивают курсор на другой элемент (например, F) и отпускают, выбирается элемент, над которым курсор находится. Не проблема. Это открывает диалоговое окно, они выполняют свою работу, и когда диалоговое окно закрывается, они возвращаются в список, и выбранный элемент выделяется (F все еще выделен). Опять же, не проблема. Проблема в том, что, возвращаясь в ListView, они используют клавиши со стрелками вверх или вниз для перемещения по списку. Пусть говорят, что однажды они нажали клавишу со стрелкой вниз. На данный момент, потому что они были первоначально на A, когда они тащили мышь до F, B. Таким образом, хотя F был правильно выбран, ListView по-прежнему считает, что A был последним выбранным, и он будет возвращаться к этому выбору, если используются стрелки вверх или вниз.

Я провел много охоты, и для этого есть различные фрагменты кода, и с помощью элемента управления ListView (или какого-либо другого элемента управления или формы в целом) и захвата нажатия клавиш, но ничего действительно не последовательного, по крайней мере, из Пример "Начать готово". Может ли кто-нибудь дать представление? Если вы начнете обсуждать делегатов или создаете обработчик событий и т.д., Все, о чем я прошу, так это то, что вы, пожалуйста, зайдете достаточно подробно, чтобы я мог понять, о чем вы говорите.

Благодарю!

1 ответ

Используйте событие KeyPress.

Класс ListView

Объявление обработчика событий

this.listView1.KeyPress += listView1_keyDown;

В обработчике событий вы можете сделать что-то похожее:

private void listView1_KeyDown(object sender, KeyEventArgs e)
{ switch (e.KeyCode) { case Keys.Up: //Change Last Selected Item break; case Keys.Down: break; default: break; }
}

И добавьте дополнительную логику, в которой вы нуждаетесь.

Также рассмотрите событие с измененным индексом:

this.listView1.SelectedIndexChanged

Дополнительные мысли: убедитесь, что выбор нескольких строк отключен. Не уверен, что это применимо к вам, но если это разрешено, вы можете выбрать A и выбрать F правильно, однако A придет первым в отображении логики после. Если ваш код не ожидает более одного выбранного элемента, это также может быть причиной.

this.listView1.MultiSelect = false;

licensed under cc by-sa 3.0 with attribution.