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>))