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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 21:45:29