为啥Datagridview的最后一行不能排序?

Posted

技术标签:

【中文标题】为啥Datagridview的最后一行不能排序?【英文标题】:Why last row of Datagridview can't sort?为什么Datagridview的最后一行不能排序? 【发布时间】:2022-01-12 08:51:14 【问题描述】:

这是我的代码:

string ColumnName_Idx="Idx";

表单加载:

        DataGridViewCheckBoxColumn col1 = new System.Windows.Forms.DataGridViewCheckBoxColumn();
        col1.DataPropertyName = "FLAG";
        col1.Name = "FLAG";           
        col1.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic;
        DGV_List.Columns.Add(col1);

        DGV_List.Columns.Add(ColumnName_Idx, ColumnName_Idx);
        DGV_List.Columns[ColumnName_Idx].Visible = true;
        DGV_List.Columns[ColumnName_Idx].DataPropertyName  =ColumnName_Idx ;
        DGV_List.Columns[ColumnName_Idx].SortMode = DataGridViewColumnSortMode.Programmatic ;


        DataTable oData = new DataTable();
        oData.Columns.Add("FLAG", typeof(bool));
        oData.Columns.Add("FLAG_BASE", typeof(bool));
        oData.Columns.Add("FLAG_SELECT", typeof(bool));
        oData.Columns.Add("GROUP_NAME");
        oData.Columns.Add("TOOL_NAME");
        oData.Columns.Add("MODEL_TRIAL_NO");
        oData.Columns.Add(ColumnName_Idx, typeof(int));
        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;
            oData.Rows.Add(dr);
        
   

        DGV_List.DataSource = oData;
        DGV_List.Sort(this.DGV_List.Columns["FLAG"], ListSortDirection.Ascending);

事件单元格点击:

private void DGV_List_CellClick(object sender, DataGridViewCellEventArgs e)

  
        this.DGV_List.BeginEdit(true);
        for (int i = 0; i < DGV_List.Rows.Count; i++)
        
            DGV_List.Rows[i].Cells[ColumnName_Idx].Value = i+1;
                        
        this.DGV_List.EndEdit();
        DGV_List.Sort(this.DGV_List.Columns[ColumnName_Idx], ListSortDirection.Ascending);
        

当我点击复选框列时,DatagridView 的最后一行无法正确排序。

结果:

这是预期结果:

为什么Datagridview的最后一行不能排序?

【问题讨论】:

【参考方案1】:

关于您在这里尝试做什么有很多问题。因此,直截了当……我相信您描述的问题来自这样一个事实,即代码将值添加到“网格单元”而不是将值添加到网格DataSource 单元格。

请记住,IFDataGridViewDataSource ...THEN ... 从技术上讲,您可以通过以下两种方式之一对网格进行排序... 1) 您可以将“GRID”排序为当前代码确实......或者...... 2)您可以通过对网格“DATASOURCE”进行排序来对网格进行排序。显然,如果将两者混合使用,您可能会得到不希望的结果。

首先并且可能最相关的方面是IF 您对“GRID”进行排序,就像您的代码当前所做的那样……THEN……在排序之后……网格行和网格中的底层DataRows@987654329 @ 不一定是相同的顺序。如果您过滤 GRID,同样的想法也适用。在几乎所有情况下,当您对 GRID 进行排序时,底层数据源都保持不变。

很不清楚“为什么”你会将排序代码放在网格中CellClick 事件...? ……有了这个,每次用户点击一个单元格,然后网格被重新排序……? … 这很奇怪,而且在 99% 的单元格点击中显然是不必要的,因为网格已经排序。

为了提供一个简单的解决方案,我建议……当代码设置“idx”数字时……而不是循环遍历 GRID 行并设置每个单元格……而是循环遍历网格 DataSource 行并设置单元格与网格单元相反。下面的代码似乎可以按照您的意愿行事……但这又不清楚。

private void DGV_List_CellClick(object sender, DataGridViewCellEventArgs e) 
  DataTable gridTable = (DataTable)DGV_List.DataSource;
  for (int i = 0; i < gridTable.Rows.Count; i++) 
    gridTable.Rows[i][ColumnName_Idx] = i + 1;
  
  DGV_List.Sort(this.DGV_List.Columns[ColumnName_Idx], ListSortDirection.Ascending);

如果这不是您要寻找的……那么……请编辑您的问题以阐明您要完成的工作。最后,毫无疑问,您应该从CellClick 事件的网格中删除排序。

【讨论】:

我必须保持Datagridview的顺序,如果改变数据源是不正确的。 我想在编辑 CellValue 时关闭排序(单击标题时仍然允许排序)。所以我添加了一个 tmp 列来保持目标行的索引。 “我必须保持 Datagridview 的顺序,如果更改数据源,则不正确。” ...我的代码在哪里“更改”数据源顺序? “我想在编辑 CellValue 时关闭排序(单击标题时仍然允许排序)。” ...然后在设置值之前“取消排序”网格。代码在表单加载事件结束时对网格进行排序。您可以关闭表单加载事件中完成的排序,也可以使用我的解决方案……两者都会产生相同的结果。再一次……不清楚你在这里想要什么。你能举个例子吗? 在加载事件中:我按“FLAG”排序,我想在编辑时保持这个顺序。

以上是关于为啥Datagridview的最后一行不能排序?的主要内容,如果未能解决你的问题,请参考以下文章

c# winform datagridview第一行单元格不能调整高度~~

点击datagridview的列标题为啥不自动排序

怎么让datagridview默认选中一行,系统默认的是选中第一行的第一个单元格。谢谢

数据库 C# datagridview可不可以让某一列禁止被更改

怎么给datagridview的每行添加标题,比如“第一行”,“第二行”,“第三行”

DatagridView 选择最后一行