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

VB.NET无BindingSource实现ComboBox实时筛选及教程咨询

VB.NET DataView 实时筛选实现方案

一、无需BindingSource的实时筛选实现

首先需要将DataView声明为窗体级变量,否则在TextChanged事件中无法访问初始的数据源视图。

步骤1:声明窗体级变量

在窗体类的顶部添加变量声明:

Private dv_Prospectos As DataView ' 全局DataView变量,用于跨事件访问

步骤2:修改加载事件代码

将原局部dv变量替换为窗体级变量:

Private Sub ProspectosMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'Fill Prospectos
    Dim dt_Prospectos As DataTable

    dt_Prospectos = Fill("SP_Obtiene_Prospectos", 0)

    dv_Prospectos = dt_Prospectos.AsDataView() ' 赋值给窗体级变量
    dv_Prospectos.Sort = "Compañia"
    dgvProspectosMain.DataSource = dv_Prospectos
    dgvProspectosMain.Columns("IdPros").Visible = False
    dgvProspectosMain.Columns("Compañia").HeaderText = "Compañia"
    dgvProspectosMain.Columns("Contacto").HeaderText = "Contacto"
    dgvProspectosMain.Columns("Dir").HeaderText = "Direccion"
    dgvProspectosMain.Columns("Mail").HeaderText = "Mail"
    dgvProspectosMain.Columns("Telefono").HeaderText = "Telefono 1"
    dgvProspectosMain.Columns("Telefono2").HeaderText = "Telefono 2"
    dgvProspectosMain.Columns("Observaciones").HeaderText = "Observaciones"
    dgvProspectosMain.Columns("Nombre").HeaderText = "Contacto usalentes"
    dgvProspectosMain.Columns("FechaAlta").HeaderText = "Fecha de Alta"
    dgvProspectosMain.Columns("IdLocalPuesto").Visible = False

    'Combo Compañias
    Dim dt_Co As DataTable
    dt_Co = Fill("SP_Obtiene_Prospectos_Combos", 0)
    cboCompañia.DataSource = dt_Co
    cboCompañia.DisplayMember = "Compañia"
    cboCompañia.ValueMember = "Compañia"
    'Combo Contactos
    Dim dt_Con As DataTable
    dt_Con = Fill("SP_Obtiene_Prospectos_Combos", 1)
    cboContacto.DataSource = dt_Con
    cboContacto.DisplayMember = "Nombre"
    cboContacto.ValueMember = "Nombre"
End Sub

步骤3:实现TextChanged筛选逻辑

在cboCompañia_TextChanged事件中设置RowFilter实现实时模糊筛选:

Private Sub cboCompañia_TextChanged(sender As Object, e As EventArgs) Handles cboCompañia.TextChanged
    ' 空输入时显示全部数据
    If String.IsNullOrEmpty(cboCompañia.Text.Trim()) Then
        dv_Prospectos.RowFilter = ""
        Return
    End If

    ' 模糊匹配Compañia列,%表示任意字符
    dv_Prospectos.RowFilter = $"Compañia LIKE '%{cboCompañia.Text.Trim()}%'"
End Sub

注意事项

  • 若需要区分大小写,可设置dv_Prospectos.CaseSensitive = True(默认不区分)
  • 列名包含特殊字符(如Compañia的ñ)可直接在RowFilter中使用,DataView会自动识别

二、使用BindingSource的实现方案(推荐)

BindingSource是.NET数据绑定的中间层,能简化筛选、排序、数据导航等操作,比直接操作DataView更灵活易维护。

步骤1:声明窗体级BindingSource变量

Private bs_Prospectos As New BindingSource()

步骤2:替换加载事件中的数据源

用BindingSource作为DataGridView的数据源:

Private Sub ProspectosMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'Fill Prospectos
    Dim dt_Prospectos As DataTable = Fill("SP_Obtiene_Prospectos", 0)

    bs_Prospectos.DataSource = dt_Prospectos
    bs_Prospectos.Sort = "Compañia" ' 设置排序规则
    dgvProspectosMain.DataSource = bs_Prospectos

    ' 列设置代码不变...
    dgvProspectosMain.Columns("IdPros").Visible = False
    ' ...省略其他列设置

    ' Combo部分代码不变...
End Sub

步骤3:修改筛选逻辑

利用BindingSource的Filter属性实现筛选:

Private Sub cboCompañia_TextChanged(sender As Object, e As EventArgs) Handles cboCompañia.TextChanged
    If String.IsNullOrEmpty(cboCompañia.Text.Trim()) Then
        bs_Prospectos.RemoveFilter() ' 清除筛选
        Return
    End If

    ' Filter语法与DataView.RowFilter完全一致
    bs_Prospectos.Filter = $"Compañia LIKE '%{cboCompañia.Text.Trim()}%'"
End Sub

BindingSource核心知识点

  • 数据中转:作为数据源与控件的中间层,统一管理数据操作
  • Filter属性:支持SQL风格的筛选表达式(=、<>、LIKE、IN等)
  • Sort属性:多列排序用逗号分隔,如"Compañia ASC, Contacto DESC"
  • Current属性:快速获取当前选中的行数据
  • ResetBindings方法:数据源结构变化时调用bs_Prospectos.ResetBindings(False)刷新控件显示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 22:15:12