Как использовать 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 не является подходящим местом для изменения размера списка.