Visual Basic中如何判断DataGridView数据源并实现日期筛选?
VB DataGridView数据源判断错误的解决方法
错误原因
你直接用DataGridView1.DataSource = CstmrOrder_Query进行比较是错误的:
DataSource返回的是Object类型,无法直接和强类型DataTable(如CstmrOrder_QueryDataTable)用=运算符比较- 即使是同一个数据表的不同实例,引用地址不同,直接比较也不会相等,因此触发"Operator '=' is not defined"错误
替代方案
方案1:用Tag属性记录数据源标识
切换数据源时,给DataGridView的Tag属性赋值标识字符串,筛选时通过Tag判断当前数据源:
' 切换数据源的代码示例 ' 切换到CstmrOrder_Query DataGridView1.DataSource = CstmrOrder_Query DataGridView1.Tag = "CstmrOrder_Query" ' 切换到SuppliesStocks DataGridView1.DataSource = SuppliesStocks DataGridView1.Tag = "SuppliesStocks"
筛选逻辑:
If DataGridView1.Tag.ToString() = "CstmrOrder_Query" Then Using cmd As New OleDbCommand("Select * from CstmrOrder_Query where OrderDateTime Between @StartDate and @EndDate", conn) cmd.Parameters.AddWithValue("@StartDate", DateTimePicker1.Value.Date) cmd.Parameters.AddWithValue("@EndDate", DateTimePicker3.Value.Date) Using da As New OleDbDataAdapter(cmd) Dim dt As New DataTable() da.Fill(dt) DataGridView1.DataSource = dt DataGridView1.Tag = "CstmrOrder_Query" End Using End Using ElseIf DataGridView1.Tag.ToString() = "SuppliesStocks" Then Using cmd As New OleDbCommand("Select * from SuppliesStocks where StockInDateTime Between @StartDate and @EndDate", conn) cmd.Parameters.AddWithValue("@StartDate", DateTimePicker1.Value.Date) cmd.Parameters.AddWithValue("@EndDate", DateTimePicker3.Value.Date) Using da As New OleDbDataAdapter(cmd) Dim dt As New DataTable() da.Fill(dt) DataGridView1.DataSource = dt DataGridView1.Tag = "SuppliesStocks" End Using End Using End If
方案2:通过DataTable的TableName判断
如果你的DataTable的TableName属性已正确设置(比如与数据库表/查询名一致),可以直接转换DataSource为DataTable后判断TableName:
Dim currentTable As DataTable = TryCast(DataGridView1.DataSource, DataTable) If currentTable IsNot Nothing Then Select Case currentTable.TableName Case "CstmrOrder_Query" Using cmd As New OleDbCommand("Select * from CstmrOrder_Query where OrderDateTime Between @StartDate and @EndDate", conn) cmd.Parameters.AddWithValue("@StartDate", DateTimePicker1.Value.Date) cmd.Parameters.AddWithValue("@EndDate", DateTimePicker3.Value.Date) Using da As New OleDbDataAdapter(cmd) Dim dt As New DataTable() da.Fill(dt) DataGridView1.DataSource = dt End Using End Using Case "SuppliesStocks" Using cmd As New OleDbCommand("Select * from SuppliesStocks where StockInDateTime Between @StartDate and @EndDate", conn) cmd.Parameters.AddWithValue("@StartDate", DateTimePicker1.Value.Date) cmd.Parameters.AddWithValue("@EndDate", DateTimePicker3.Value.Date) Using da As New OleDbDataAdapter(cmd) Dim dt As New DataTable() da.Fill(dt) DataGridView1.DataSource = dt End Using End Using End Select End If
额外注意事项
- 每次筛选要重新实例化
DataTable(或清空原有数据),避免旧数据被追加 - 不要直接拼接SQL字符串,改用参数化查询,既避免SQL注入风险,也能解决日期格式兼容问题
内容的提问来源于stack exchange,提问作者Robin
相关产品推荐
相关产品推荐

