我目前为ListView
设置了这个。但是想知道是否有类似的方法可以使用ListBox
来做到这一点。我想返回一个与条件匹配的项目数组(在这种情况下,返回列表框中与applicationName
匹配的项目,这是一个字符串)。
我已经包含了适用于我的列表视图的内容:
Dim listviewitem As ListViewItem
Dim ListViewItems() As ListViewItem = Me.ApplicationsListView.Items.Find(applicationName, True)
For Each listviewitem In ListViewItems
listviewitem.Checked = True
Next
我似乎无法将其与ListBox
一起使用的原因是它没有Find
方法进行Me.ApplicationsListBox.Items
。想知道列表框是否有类似的方法。
这是一个扩展方法,它将以可枚举列表的形式返回ListBox
中具有特定文本的所有项目:
Imports System.Runtime.CompilerServices
Public Module ListBoxExtensions
<Extension>
Public Iterator Function Find(source As ListBox, value As String) As IEnumerable(Of Object)
Dim items = source.Items
For i = 0 To items.Count - 1
Dim item = items(i)
If source.GetItemText(item) = value Then
Yield item
End If
Next
End Function
End Module
下面是一些示例用法:
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim table As New DataTable
With table.Columns
.Add("Id", GetType(Integer))
.Add("Name", GetType(String))
End With
With table.Rows
.Add(1, "Peter")
.Add(2, "Paul")
.Add(3, "Mary")
.Add(4, "Peter")
End With
ListBox1.DisplayMember = "Name"
ListBox1.DataSource = table
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim peters = ListBox1.Find("Peter").ToArray()
For Each row As DataRowView In peters
Console.WriteLine(row("Id"))
Next
End Sub
End Class
调试该代码时,该"输出"窗口将显示以下内容:
1 4
您可以按原样使用该代码,也可以根据需要调整原理。传递修改方法以接受谓词,然后匹配您喜欢的任何方式。如果您愿意,可以修改代码以直接在窗体中使用,而不是作为扩展使用。重要的是原则。