如何使用FindItemWithText?

问题描述:

下面是我正在使用的代码。我的帐户存储在字典(字符串,整数)中,以便我可以轻松地将值与它们关联。我将listview转换为virtualmode后,我的listview效果很好,但我失去了搜索的功能,只需在列表视图中输入,这是我想要回来的。没有它,这使得整个功能几乎没用,除非我可以按名称搜索。我已经搜索并实施了多个例子,我无法获得任何工作。我究竟做错了什么?它应该怎么看?如何使用FindItemWithText?

这填充我的列表视图。

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 
+0

我真的很希望有人能够帮助我解决这个问题。 – Josh 2014-11-26 16:38:54

在你的处理器为SearchForVirtualItem事件,您必须搜索你的字典里,然后告诉ListView行的匹配什么类型的索引。

猜你想搜索的文字,你想是这样的:

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

顺便说一句,这是更好地更新虚拟列表其他地方的大小。 RetrieveVirtualItem事件的处理程序不是更改列表大小的正确位置。

+0

Thanks @Grammarian。我将与此合作。 – Josh 2014-11-28 19:12:00