通过TextBox检索已填充ListView仅保留匹配行的VB代码实现问题
问题根因
DataTable.Select()方法会返回符合筛选条件的DataRow数组,原有代码没有接收该返回值,依然遍历了dt4的全量原始行,导致筛选不生效- 事件中打开的数据库连接全程未使用,属于冗余代码,会造成不必要的资源占用
- ListView的列配置、视图样式属于固定配置,不需要每次文本变更都重复执行
修正后代码
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged ' 清空现有列表项 ListView3.Items.Clear() ' 获取筛选后的行数组 Dim filterRows As DataRow() If String.IsNullOrWhiteSpace(TextBox1.Text) Then filterRows = dt4.Select() ' 搜索框为空时返回全部行 Else ' 转义单引号避免语法错误 Dim searchTxt = TextBox1.Text.Replace("'", "''") filterRows = dt4.Select($"ServiceName like '%{searchTxt}%'") End If ' 仅遍历筛选后的行填充列表 For Each row As DataRow In filterRows Dim item As New ListViewItem() With {.Checked = False} item.SubItems.Add(row("CPTCode").ToString()) item.SubItems.Add(row("ServiceName").ToString()) ListView3.Items.Add(item) Next End Sub
可选优化
可将ListView的固定配置移到窗体Load事件中,减少重复执行的冗余操作:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load With ListView3 .View = View.Details .GridLines = True .Columns.Clear() .Columns.Add(" ", 30) .Columns.Add("CPT Code", 80, HorizontalAlignment.Left) .Columns.Add("Service Name", 350, HorizontalAlignment.Left) End With End Sub
内容的提问来源于stack exchange,提问作者gurpreet
相关产品推荐
相关产品推荐

