WinForms中DataGridView仅首次填充,后续无法加载问题求助
解决WinForms切换分类后DataGridView无法重新加载数据的问题
核心问题分析
你的代码存在以下几个导致后续加载异常的关键问题:
- 每次切换子分类时,未清除之前手动添加的列(如
Test1、Jugement OK等),导致列重复、数据绑定逻辑混乱 - 直接调用
Rows.Clear()与DataBinding机制冲突,绑定数据源后行操作受数据绑定限制,无法彻底重置状态 - 未正确重置DataGridView的绑定状态,残留的列配置和行状态干扰后续数据加载
修复方案及代码修改
1. 重置DataGridView状态(在comboBox2_SelectedIndexChanged开头添加)
先彻底清理之前的自定义列和行状态,避免残留配置干扰:
string w = comboBox2.Text; int t = 0; // 清除所有手动添加的列(保留DataSet绑定的核心列) var boundColumns = dataGridView2.Columns.Cast<DataGridViewColumn>() .Where(col => col.DataPropertyName != string.Empty && !col.Name.StartsWith("Test") && !col.Name.StartsWith("a")) .ToList(); dataGridView2.Columns.Clear(); boundColumns.ForEach(col => dataGridView2.Columns.Add(col)); // 重置绑定列的基础状态 foreach (var col in dataGridView2.Columns) { col.ReadOnly = false; col.Visible = false; } // 重置所有行的单元格值和可见性 foreach (DataGridViewRow row in dataGridView2.Rows) { row.Visible = true; row.Cells["toleranceMinDataGridViewTextBoxColumn"].Value = ""; row.Cells["toleranceNomDataGridViewTextBoxColumn"].Value = ""; row.Cells["toleranceMaxDataGridViewTextBoxColumn"].Value = ""; }
2. 修正数据源绑定逻辑
替换原来的数据源重置代码,避免绑定冲突:
// 先解绑数据源,再重新绑定 dataGridView2.DataSource = null; // 可选:根据当前分类筛选数据(而非绑定整个Tolerance表,提升性能) // var filteredData = dataSet1.Tolerance.AsEnumerable() // .Where(row => row["对应分类字段"].ToString() == comboBox1.Text + comboBox2.Text) // .CopyToDataTable(); // dataGridView2.DataSource = filteredData; dataGridView2.DataSource = this.dataSet1.Tolerance;
3. 修复SQL注入风险(可选但强烈建议)
在comboBox1_SelectedIndexChanged中,将字符串拼接SQL改为参数化查询:
cmd2.CommandText = "SELECT section FROM Type where typee = @Type"; cmd2.Parameters.AddWithValue("@Type", a);
修复效果
修改后,每次切换分类/子分类时,DataGridView会先彻底清理之前的自定义列和状态,再重新绑定数据并生成新的测量列,解决后续加载异常的问题。
内容的提问来源于stack exchange,提问作者LiterallyGutsFromBerserk
相关产品推荐
相关产品推荐

