You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在VB.NET中实现ComboBox的实时模糊过滤(含前后通配符)

VB.NET ComboBox 实时包含式过滤实现方案

核心思路

要实现用户输入时实时过滤下拉列表(包含匹配,即输入内容前后加通配符的效果),需要先保存原始数据源,再通过TextChanged事件实时筛选并更新下拉项,同时修正现有代码中的潜在问题。


步骤1:添加原始数据源存储变量

在窗体类中声明私有变量,用于保存从数据库加载的所有原始零件编号,避免过滤时丢失数据源:

' 存储所有原始零件编号,用于实时过滤
Private originalDiePartNumbers As List(Of String) = New List(Of String)()

步骤2:修复数据库加载方法

修正LoadAllDiePartNumbers中的SQL查询(解决字段别名错误),并将数据同时存入原始列表和ComboBox:

Private Sub LoadAllDiePartNumbers()
    ' 修正SQL:仅查询需要的字段并指定别名,用DISTINCT在数据库层面去重
    Dim query As String = "SELECT DISTINCT i.Item1 AS Item FROM database1 i " &
        "INNER JOIN database2 l ON i.Item1 = l.Item1 AND i.Item2 = l.Item2 " &
        "INNER JOIN database3 o ON i.Item1 = o.Item1 AND i.Item2 = o.Item2 " &
        "WHERE i.Item2 = @SiteValue AND i.Item1 LIKE 'PJ%' AND l.Item1 IS NOT NULL AND l.Item3 IS NULL"

    sqlControl.AddParam("@SiteValue", SiteValue)
    sqlControl.ExecQuery(query)

    If Not sqlControl.HasException() AndAlso sqlControl.CSIDT.Rows.Count > 0 Then
        DiePartNum_cbx.Items.Clear()
        originalDiePartNumbers.Clear()

        For Each row As DataRow In sqlControl.CSIDT.Rows
            Dim diePartNum As String = row("Item").ToString().Trim()
            originalDiePartNumbers.Add(diePartNum)
            DiePartNum_cbx.Items.Add(diePartNum)
        Next
    End If
End Sub

步骤3:实现实时过滤的TextChanged事件

添加TextChanged事件处理逻辑,用户输入时自动筛选包含输入内容的项(不区分大小写):

Private Sub DiePartNum_cbx_TextChanged(sender As Object, e As EventArgs) Handles DiePartNum_cbx.TextChanged
    Dim searchText As String = DiePartNum_cbx.Text.Trim()
    DiePartNum_cbx.Items.Clear()

    If String.IsNullOrEmpty(searchText) Then
        ' 输入为空时恢复所有原始项
        DiePartNum_cbx.Items.AddRange(originalDiePartNumbers.ToArray())
    Else
        ' 筛选包含搜索文本的项(模拟%xxx%的通配符匹配)
        Dim filteredItems = originalDiePartNumbers.Where(Function(num) 
                                                             num.IndexOf(searchText, StringComparison.OrdinalIgnoreCase) >= 0
                                                         ).ToList()
        DiePartNum_cbx.Items.AddRange(filteredItems.ToArray())
    End If

    ' 保持输入文本不变并定位光标到末尾
    DiePartNum_cbx.Text = searchText
    DiePartNum_cbx.SelectionStart = searchText.Length
    DiePartNum_cbx.SelectionLength = 0

    ' 自动展开下拉列表提升体验
    DiePartNum_cbx.DroppedDown = True
End Sub

步骤4:调整现有事件适配过滤逻辑

更新KeyPress事件,从过滤后的项中查找匹配内容:

Private Sub DiePartNum_cbx_KeyPress(sender As Object, e As KeyPressEventArgs) Handles DiePartNum_cbx.KeyPress
    If e.KeyChar = Convert.ToChar(Keys.Enter) Then
        Dim typedValue As String = DiePartNum_cbx.Text.Trim()

        If Not String.IsNullOrEmpty(typedValue) Then
            ' 从当前过滤后的项中查找匹配项
            Dim selectedValue As String = DiePartNum_cbx.Items.Cast(Of String)().FirstOrDefault(Function(item) 
                                                                                                   String.Equals(item, typedValue, StringComparison.OrdinalIgnoreCase)
                                                                                               )

            If selectedValue IsNot Nothing Then
                DiePartNum_cbx.SelectedItem = selectedValue
            Else
                LoadDieLotValues(typedValue)
            End If
        End If

        e.Handled = True
    End If
End Sub

关键属性设置

在窗体设计器中,将DiePartNum_cbx的以下属性调整为:

  • DropDownStyle: DropDown(允许用户输入文本)
  • AutoCompleteMode: None(禁用系统自动完成,避免与自定义过滤冲突)
  • AutoCompleteSource: None

内容的提问来源于stack exchange,提问作者user22431169

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 15:18:30