C# WinForms ListBox Инкрементальный поиск с парой ключ / значение в виде ListItems

Я искал ответ, и хотя есть один, который работает при использовании списка со элементами типа строки, я не могу понять, как конвертировать, когда мои элементы имеют тип

KeyValuePair<string, ChangeRec>

Я хочу иметь возможность поиска по мере ввода в списке (не могу использовать ComboBox, так как элемент управления должен быть определенного размера в форме), поиск по ключевому элементу (текст). Спасибо @Marcel Popescu за отправную точку. Вот моя версия кода (прокомментировал только над строкой, где он терпит неудачу, так как он по праву не может привести элемент kvp как строку):

private string searchString;
private DateTime lastKeyPressTime;

private void lbElementNames_KeyPress(object sender, KeyPressEventArgs e)
{
    this.IncrementalSearch(e.KeyChar);
    e.Handled = true;
}

private void IncrementalSearch(char ch)
{
    if ((DateTime.Now - this.lastKeyPressTime) > new TimeSpan(0, 0, 1))
    {
        this.searchString = ch.ToString();
    }
    else
    {
        this.searchString += ch;
    }
    this.lastKeyPressTime = DateTime.Now;
    //* code falls over HERE *//
    var item =
        this.lbElementNames.Items.Cast<string>()
            .FirstOrDefault(it => it.StartsWith(this.searchString, true, CultureInfo.InvariantCulture));

    if (item == null) return;
    var index = this.lbElementNames.Items.IndexOf(item);
    if (index < 0) return;        
    this.lbElementNames.SelectedIndex = index;
}

1 ответ

Решение

Используйте это, я предполагаю, что это Key из KeyValuePair что вы хотите найти в:

//* code falls over HERE *//

var item =
        this.lbElementNames.Items.Cast<KeyValuePair<string, ChangeRec>>()
            .FirstOrDefault(it => it.Key.StartsWith(this.searchString, true, CultureInfo.InvariantCulture));

if (item.Equals(default(KeyValuePair<string, ChangeRec>))) return;

Поскольку KeyValuePair является типом значения, он никогда не может быть нулевым. Чтобы узнать, было ли ему присвоено значение, мы проверяем, используя item.Equals(default(KeyValuePair<string, ChangeRec>))

Другие вопросы по тегам