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
相关产品推荐
相关产品推荐

