为什么WinForm中DataGridView点击复选框列后最后一行排序异常?
问题根本原因
- 底层绑定数据源未同步:DataGridView绑定DataTable后,排序逻辑默认读取底层DataTable的存储值而非UI层临时修改的单元格值。你在CellClick事件中仅修改了DataGridView的单元格显示值,没有同步更新对应DataRow的Idx列值,导致排序时读取到的是初始化时未赋值的int默认值0,最后一行排序计算异常。
- 编辑状态提交顺序错误:点击复选框触发事件时,复选框的修改还未提交到底层数据源,你就先行执行Idx赋值和排序逻辑,此时数据源中FLAG列的值还是修改前的旧值,排序基准错误。
- 初始化时Idx列无有效值:你创建DataRow时未给Idx列赋值,所有行初始的Idx底层值均为0,初始排序的基准本身就存在逻辑缺陷。
修复方案
- 首先修正初始化逻辑,给Idx列赋初始值:
在你创建DataRow的循环中添加赋值逻辑:
for (int i = 1; i <= 5; i++) { DataRow dr = oData.NewRow(); if(i==1) dr["FLAG"] = true ; else dr["FLAG"] = false; dr["FLAG_BASE"] = false; dr["FLAG_SELECT"] = false; dr["MODEL_TRIAL_NO"] = "test" + i; // 新增Idx初始赋值 dr[ColumnName_Idx] = i; oData.Rows.Add(dr); }
- 修正CellClick事件逻辑,优先提交编辑、直接操作底层数据源:
private void DGV_List_CellClick(object sender, DataGridViewCellEventArgs e) { // 先提交当前复选框的编辑修改到数据源 if (DGV_List.IsCurrentCellDirty) { DGV_List.CommitEdit(DataGridViewDataErrorContexts.Commit); } // 直接操作底层DataTable更新Idx值,自动同步UI DataTable sourceDt = (DataTable)DGV_List.DataSource; for (int i = 0; i < sourceDt.Rows.Count; i++) { sourceDt.Rows[i][ColumnName_Idx] = i + 1; } // 执行排序 DGV_List.Sort(DGV_List.Columns[ColumnName_Idx], ListSortDirection.Ascending); }
内容的提问来源于stack exchange,提问作者D T
相关产品推荐
相关产品推荐

