Dyaminigo
@Dyaminigo
.NET Developer

Как отменить реакцию фокуса в ListBox при нажатии на клавишу?

Существует форма, на которой главными элементами являются ListBox, строка поиска и ComboBox (для выбора разделов).
При получении данных из интернета ListBox заполняется несколькими сотнями значений, а взаимодействие с этими значениями (точнее, с индексами значений) осуществляется при помощи комбинаций клавиш (Событие listData_KeyDown). К примеру, в списке есть 5 элементов: 1, 2, 3, 4, 5. При выделении требуемого элемента стрелочками или мышью, нажимаем Ctrl + D, далее берём индекс выделенного элемента и уже взаимодействуем с элементом из внутреннего списка по этому индексу. Но тут возникает неприятная ситуация, когда у нас, например, несколько сотен строк, которые начинаются с разных букв/символов/цифр, и при нажатии на Ctrl + D, если в списке есть строка, начинающаяся с буквы D, то вне зависимости от того, какая строка была выделена, фокус перелетает на строку с буквой D в начале.
Хоть действие выполняется с тем элементом, на котором была нажата комбинация клавиш, но всё равно видеть, что фокус перелетает каждый раз с нужной строки на не нужную - это как-то неправильно.
Я пытался возвращать фокус назад, на выделенную строку, путём присвоения свойству listData.SelectedIndex индекса строки, также вызовом метода listData.SetSelected(), но часто случается, что пользователь наблюдает мелькание фокуса и перелистывание списка, когда он сначала перелетает на строку с первой буквой клавиши, а потом возвращается.
Как можно отменить реакцию фокуса в ListBox при нажатии комбинации клавиш? Чтобы он не перелетал на строку с первой буквой клавиши? Может есть какое-то решение из коробки, которое бы позволило отключить подобную реакцию ListBox. Буду признателен за ответы.
Проект Windows Forms, Visual Studio 2017 Community.
  • Вопрос задан
  • 477 просмотров
Решения вопроса 1
@rFczZZ
private void listBox1_KeyDown(object sender, KeyEventArgs e)
{
    // для всех нужных сочетаний клавиш
    if (e.Modifiers == Keys.Control)
    {
        listBox1.Items[listBox1.SelectedIndex] = $"{listBox1.SelectedItem} !!!";

        // нужно установить флаг SuppressKeyPress, 
        // чтобы сообщение не обрабатывалось дальше
        e.SuppressKeyPress = true;
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы