如何使用FindItemWithText?

时间:2014-11-25 14:43:30

标签: vb.net listview virtualmode

以下是我正在使用的代码。我的帐户存储在Dictionary(Of String,Integer)中,以便我可以轻松地将值与它们相关联。我将listview转换为虚拟模式后,我的列表视图效果很好但是我输入了listview的功能,只需输入listview,这就是我想要回来的内容。没有它,这使得整个功能几乎无用,除非我可以按名称搜索。我已经搜索并实现了多个示例,但我无法完成任何工作。我究竟做错了什么?怎么看?

这会填充我的列表视图。

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。无论我搜索它,它都会不断返回null。

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 个答案:

答案 0 :(得分:1)

SearchForVirtualItem事件的处理程序中,您必须搜索字典,然后告诉ListView与所输入内容匹配的行的索引。

猜测你想要搜索文本,你需要这样的东西:

foreach (var x in MainForm.accounts) {
    if (x.Value == e.Text) {
        e.Index = x.Key;
        return;
    }
}
顺便说一句,最好在其他地方更新虚拟列表的大小。 RetrieveVirtualItem事件的处理程序不是更改列表大小的正确位置。