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

为什么WinForm中DataGridView点击复选框列后最后一行排序异常?

问题根本原因
  • 底层绑定数据源未同步:DataGridView绑定DataTable后,排序逻辑默认读取底层DataTable的存储值而非UI层临时修改的单元格值。你在CellClick事件中仅修改了DataGridView的单元格显示值,没有同步更新对应DataRow的Idx列值,导致排序时读取到的是初始化时未赋值的int默认值0,最后一行排序计算异常。
  • 编辑状态提交顺序错误:点击复选框触发事件时,复选框的修改还未提交到底层数据源,你就先行执行Idx赋值和排序逻辑,此时数据源中FLAG列的值还是修改前的旧值,排序基准错误。
  • 初始化时Idx列无有效值:你创建DataRow时未给Idx列赋值,所有行初始的Idx底层值均为0,初始排序的基准本身就存在逻辑缺陷。
修复方案
  1. 首先修正初始化逻辑,给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);
}
  1. 修正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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:54:00