调用DataTable.Rows.Add传入已填充DataRow仅新增空行问题排查
问题原因
DataRow与所属DataTable强绑定,若sortedStus中的行不属于当前操作的dt实例,或是在调用dt.Clear()/dt.Rows.Clear()后原属于dt的行被标记为脱离状态,直接调用dt.Rows.Add()传入这类行都无法正常读取数据,仅会插入空行。- 代码中
dgvClassStuInfo.DataSource = dt;为多余重复赋值,dt本身已经是控件绑定的数据源,修改dt内容会自动同步到DataGridView。
解决方案
可根据实际场景选择以下任意一种方案:
方案1:使用ImportRow导入行(适用于行来自其他表或已被脱离)
ImportRow方法会自动复制目标行的所有字段数据到当前表,不受行所属表限制:
sortedStus = Split_List(stuRows); DataTable dt = (DataTable)dgvClassStuInfo.DataSource; dt.Rows.Clear(); foreach (DataRow stuRow in sortedStus) { dt.ImportRow(stuRow); }
方案2:插入字段值数组(通用方案)
直接提取行的字段值数组传入Add方法,无需关心行的所属表:
sortedStus = Split_List(stuRows); DataTable dt = (DataTable)dgvClassStuInfo.DataSource; dt.Rows.Clear(); foreach (DataRow stuRow in sortedStus) { dt.Rows.Add(stuRow.ItemArray); }
方案3:排序替代方案(仅需对原表数据排序时推荐)
如果需求只是对原有DataTable的数据排序,不需要拆分再回填,可直接通过DataView实现:
DataTable dt = (DataTable)dgvClassStuInfo.DataSource; // 替换为实际要排序的列名,ASC为升序,DESC为降序 dt.DefaultView.Sort = "排序列名 ASC"; dgvClassStuInfo.DataSource = dt.DefaultView.ToTable();
内容的提问来源于stack exchange,提问作者budywudy9
相关产品推荐
相关产品推荐

