Listbox циклически перебирает элементы, когда нажата '1' - PullRequest
0 голосов
/ 22 мая 2018

Я создаю приложение с помощью ListBox.Я хочу, чтобы пользователь мог щелкнуть по нему, начать печатать и увидеть, как его текст отображается в этом элементе.Ниже приведена упрощенная версия, которая почти работает:

using System.Windows.Forms;

namespace ListboxTest
{
    public partial class ListboxTest : Form
    {
        InitializeComponent();
        listBox1.Items.Add("");
        listBox1.Items.Add("");
        listBox1.KeyPress += new KeyPressEventHandler(ListBoxKeyPress);
    }

    private void ListBoxKeyPress(object sender, KeyPressEventArgs e)
    {
        ListBox lbx = (ListBox)sender;
        if (lbx.SelectedIndices.Count != 1)
            return;

        int temp = lbx.SelectedIndex;
        string value = lbx.Items[temp].ToString();
        value += e.KeyChar;

        lbx.Items[temp] = value;
    }
}

Когда выбран ListBox, пользователь может начать печатать и увидеть текст.Все работает, как и ожидалось, пока не произойдут две вещи:

  1. Пользователь переключается с одного элемента на другой (нажимает на другой вход или использует стрелки вверх / вниз), а затем
  2. Пользователь нажимаетключ, соответствующий первому символу в имени невыбранного элемента.

С тех пор, когда пользователь нажимает эту клавишу (в моем случае «1»), выбранный элемент ListBox изменяется.Только с двумя элементами (оба начинаются с '1'), нажатие '1' заставляет ListBox переключать выбранный элемент с индекса 0 на индекс 1 (и наоборот).

Я немного поэкспериментировали вот что я нашел.

  • Это происходит только тогда, когда я нажимаю «1».Никакая другая цифра, цифра или знак пунктуации не вызывают этого. Это произойдет с любым символом, с которого начинается элемент ListBox.
  • Если ListBox имеет более двух элементов, он будет циклически проходить по всем ранее введеннымэлементы с одинаковым начальным символом.Элементы, которые никогда не были выбраны, пропускаются.

Что я пробовал:

  • Очистка выбранных индексов с помощью ListBox.SetSelected(int index, bool selected)
  • Очистка выбранногоиндексы на ListBox.ClearSelected()
  • Установка Listbox.SelectionMode на SelectionMode.One

Я использую VS 2015 Professional, Windows 7 SP1 (x64), C # 6.0 и нацеливаюсь на .NET 4.6.1.

Итак, мой вопрос: что происходит и как это исправить?

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Спасибо Амиту за то, что он указал мне правильное направление.Это поведение по умолчанию ListBox.Однако на самом деле есть более простой способ подавить это поведение с помощью обработчика событий, который я использую.

При использовании обработчика событий "KeyPress" вы можете установить e.Handled = true в подавить дальнейшую обработку .Это не позволяет списку выбора выбирать другой элемент при наборе.

0 голосов
/ 22 мая 2018

Если вы наберете какие-либо клавиши клавиатуры, когда Listbox находится в фокусе, он фактически перебирает все свои элементы и выбирает те элементы (один за другим), которые начинаются с набранной клавиши.так что для базового поведения Listbox.

вам необходимо использовать KeyEventArgs.SuppressKeyPress Свойство здесь, для которого вам нужно будет написать свою логику в таком случае, где вы получите KeyEvenArgs,например, KeyDown

, попробуйте следующий код

    private void lstBoxItems_KeyDown(object sender, KeyEventArgs e)
    {
        ListBox lbx = (ListBox)sender;
        if (lbx.SelectedIndices.Count != 1)
            return;

        e.SuppressKeyPress = true;

        //calling this method to get char from key data
        char keyChar = GetChar(e);

        int temp = lbx.SelectedIndex;
        string value = lbx.Items[temp].ToString();
        value += keyChar;

        lbx.Items[temp] = value;
    }

и добавьте этот метод тоже

    char GetChar(KeyEventArgs e)
    {
        int keyValue = e.KeyValue;
        if (!e.Shift && keyValue >= (int)Keys.A && keyValue <= (int)Keys.Z)
            return (char)(keyValue + 32);
        return (char)keyValue;
    }

какой-то другой вопрос, который я искал, где вы можете получить ссылку,

Как отключить элемент автоматического выбора списка при нажатии клавиши

У меня есть способ для преобразования ключевых данных в символы из этого здесь.

Получите символ на Control.KeyDown?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...