VB.NET中ComboBox数据无法在DataGridView显示的问题求助
VB.NET中ComboBox数据无法在DataGridView显示的解决方案
问题根源
你当前代码的核心问题有两个:
FillDataGridView1方法仅在_dt为空时才调用GetAndFillDataTable获取新数据,ComboBox切换选项时未重置_dt,导致一直复用第一次加载的旧数据- 窗体初始化时,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
相关产品推荐
相关产品推荐

