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

VB.NET中ComboBox数据无法在DataGridView显示的问题求助

VB.NET中ComboBox数据无法在DataGridView显示的解决方案

问题根源

你当前代码的核心问题有两个:

  1. FillDataGridView1方法仅在_dt为空时才调用GetAndFillDataTable获取新数据,ComboBox切换选项时未重置_dt,导致一直复用第一次加载的旧数据
  2. 窗体初始化时,ComboBox刚填充完就调用fillDataGridView1(),此时ComboBox1.SelectedValue是空字符串,执行查询大概率返回空结果,后续切换选项也没刷新数据

修正后的完整代码

Private _dt As DataTable

Public Sub New()
    If Me.IsInDesignMode() Then
        Return
    End If
    InitializeComponent()
    Me.PopulateComboBox()
    ' 初始化时不自动加载,避免空值查询
    ' fillDataGridView1()
End Sub

Private Function GetAndFillDataTable() As DataTable
    Dim dt As New DataTable()
    ' 处理空值情况,当SelectedValue为空时返回空表
    If ComboBox1.SelectedValue Is Nothing OrElse String.IsNullOrEmpty(ComboBox1.SelectedValue.ToString()) Then
        Return dt
    End If
    
    Dim query As String = "SELECT NOD,ITM,CIA,DPR,QTY FROM RSD WHERE QTY > 0 AND PNM=@PNM"
    Using con As OleDbConnection = New OleDbConnection(GetConnectionString)
        Using cmd As OleDbCommand = New OleDbCommand(query, con)
            cmd.Parameters.AddWithValue("@PNM", ComboBox1.SelectedValue)
            Using da As New OleDbDataAdapter(cmd)
                da.Fill(dt)
                ' Using会自动释放资源,无需手动Dispose
                Dim totalColumn As New DataColumn()
                totalColumn.DataType = GetType(Double)
                totalColumn.ColumnName = "Total"
                totalColumn.Expression = "[CIA]*[QTY]*(1-[DPR]/100)"
                dt.Columns.Add(totalColumn)
                Return dt
            End Using
        End Using
    End Using
End Function

Private Sub FillDataGridView1()
    ' 每次调用都重新获取最新数据,不再依赖_dt缓存
    _dt = GetAndFillDataTable()
    grid.DataSource = _dt
    grid.Refresh()
End Sub

Private Sub PopulateComboBox()
    Dim dt As New DataTable()
    Dim query As String = "SELECT DISTINCT PNM FROM RSD UNION SELECT DISTINCT PNM FROM RSG ORDER BY PNM"
    Try
        dt = New DataTable
        Using con As OleDbConnection = New OleDbConnection(GetConnectionString)
            Using sda As OleDbDataAdapter = New OleDbDataAdapter(query, con)
                sda.Fill(dt)
                Dim row As DataRow = dt.NewRow()
                row(0) = ""
                dt.Rows.InsertAt(row, 0)
                ComboBox1.DataSource = dt
                ComboBox1.DisplayMember = "PNM"
                ComboBox1.ValueMember = "PNM"
            End Using
        End Using
    Catch myerror As OleDbException
        MessageBox.Show("Error: " & myerror.Message)
    Finally
    End Try
End Sub

Private Sub ComboBox1_SelectionChangeCommitted(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectionChangeCommitted
    FillDataGridView1()
End Sub

关键优化点

  • 移除缓存逻辑:FillDataGridView1每次调用都重新执行查询,确保ComboBox切换后显示对应最新数据
  • 空值处理:在GetAndFillDataTable里判断ComboBox选中值,避免空值导致的无效查询或错误
  • 资源优化:去掉手动da.Dispose(),因为Using语句会自动释放OleDbDataAdapter等资源
  • 初始化调整:注释掉初始化时的fillDataGridView1(),避免一开始就显示空表,用户选择ComboBox选项后再加载数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 09:55:23