Как использовать FindItemWithText?

Ниже приведен код, с которым я работаю. Мои учетные записи хранятся в словаре (Of String, Integer), чтобы я мог легко связать с ними значение. После того как я преобразовал его в виртуальный режим, мой список просмотра работает отлично, но я потерял функциональность для поиска, просто набрав в списке, что я хотел бы вернуть. Без этого это делает всю функцию практически бесполезной, если я не могу искать по имени. Я искал и реализовал несколько примеров, и я не могу заставить что-либо работать. Что я делаю неправильно? Как это должно выглядеть?

Это заполняет мой список.

Private Sub lstAccounts_RetrieveVirtualItem(sender As Object, e As RetrieveVirtualItemEventArgs) Handles lstAccounts.RetrieveVirtualItem
    lstAccounts.VirtualListSize = MainForm.accounts.Count 'Update after a dictionary edit.

    Dim i As New ListViewItem(MainForm.accounts.Keys(e.ItemIndex))
    If MainForm.accounts.ContainsKey(MainForm.accounts.Keys(e.ItemIndex).ToString) Then
        i.SubItems.Add(MainForm.accounts.Item(i.Text))
    End If
    e.Item = i
End Sub

Это из MSDN. Предположительно, требуется для поиска, единственный пример, который я мог найти..

Private Sub lstAccounts_SearchForVirtualItem(sender As Object, e As SearchForVirtualItemEventArgs) Handles lstAccounts.SearchForVirtualItem
    Dim x As Double = 0
    If [Double].TryParse(e.Text, x) Then 'check if this is a valid search
        x = Math.Sqrt(x)
        x = Math.Round(x)
        e.Index = Fix(x)
    End If
End Sub

Это тоже из MSDN. Независимо от того, что я ищу, он постоянно возвращает ноль.

Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
    Dim item1 As ListViewItem = lstAccounts.FindItemWithText(TextBox1.Text)
    If (item1 IsNot Nothing) Then
        MessageBox.Show("Calling FindItemWithText passing" & TextBox1.Text & ": " _
            & item1.ToString())
    Else
        MessageBox.Show("Calling FindItemWithText passing" & TextBox1.Text & ": null")
    End If
End Sub

1 ответ

Решение

В вашем обработчике для SearchForVirtualItem событие, вы должны искать в своем словаре, а затем сказать ListView индекс строки, которая соответствовала тому, что было напечатано.

Догадываясь, что вы хотите найти текст, вы хотите что-то вроде этого:

foreach (var x in MainForm.accounts) {
    if (x.Value == e.Text) {
        e.Index = x.Key;
        return;
    }
}

Кстати, лучше обновить размер виртуального списка где-нибудь еще. Обработчик события RetrieveVirtualItem не является подходящим местом для изменения размера списка.

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