过滤非常冗长的ListView

时间:2015-04-27 03:55:49

标签: vb.net sorting listview listviewitem

我正在为一所学校项目工作,我正试图找出解决ListView中条目过滤/搜索问题的最佳方法。

我目前有一个名为lvCard的ListView控件(在从FormLoad上的JSON文件填充后需要进行过滤时)包含大约15000个条目。它是一个多列ListView(详细信息视图),它基本上包含了每张Magic the Gathering卡。

我还有一个名为txtSearch的搜索框。

据我所知,基本上,我需要将某些功能附加到"更改"搜索框的事件,但在那之后,我有点迷失。

目前,我所拥有的是我编写的一个子程序,它在应用程序启动时填充目标ListView,我想这提供了一些关于如何设置目标ListView的见解,但除此之外,我还是真的很困惑,可以肯定地使用一些指导。

' Render the whole list of stuff
Private Sub RenderList(dict As Dictionary(Of String, Card))

    ' Grab keys into list for sorting
    Dim lstCards As List(Of String) = dict.Keys.ToList
    lstCards.Sort()

    ' iteration
    Dim str As String
    For Each str In lstCards

        Dim CurrentCard As Card = dict(str)

        Dim CurrentPT As String
        If IsNumeric(CurrentCard.power) And IsNumeric(CurrentCard.toughness) Then
            CurrentPT = CurrentCard.power & "/" & CurrentCard.toughness
        Else
            CurrentPT = ""
        End If

        ' Build list item
        Dim CurrentItem As New ListViewItem(CurrentCard.name)
        CurrentItem.SubItems.Add(CurrentCard.manaCost)
        CurrentItem.SubItems.Add(CurrentCard.type)
        CurrentItem.SubItems.Add(CurrentPT)
        lvCard.Items.Add(CurrentItem)

    Next

End Sub

1 个答案:

答案 0 :(得分:0)

我不知道这是否有效,因为我目前无法测试它,而且我不知道这是最有效的方法,但你可以添加另一个{{ 1}}到您的ByVal子,然后将搜索项传递给它,如下所示:

RenderList

然后将Private Sub RenderList(ByVal dict As Dictionary(Of String, Card), ByVal Optional search As String = Nothing) If search Is Not Nothing Then 'Grab SEARCHED keys into list for sorting 'Populate the initial list first Dim lstCards As List(Of String) = dict.Keys.ToList 'Create a new list to contain all found items Dim newLst As List(Of String) For Each item As String In lstCards If item.ToLower.Contains(search.ToLower) Then newLst.Add(item) End If Next 'Set lstCards to the new list of items lstCards = newLst lstCards.Sort() Else 'Grab ALL keys into list for sorting Dim lstCards As List(Of String) = dict.Keys.ToList lstCards.Sort() End If /.../ End Sub 用于您的RenderList(mycards, TextBox1.Text)活动。