如何像这样自定义数据网格视图排序

本文关键字:网格 视图 排序 数据网 数据 像这样 自定义 | 更新日期: 2023-09-27 18:33:22

我有一个带有列值的 Windows 数据网格视图

id
---
0
0
0
5
2
7

我想要升序,但下面将包含零单元格。喜欢这个-

2
5
7
0
0
0

如何像这样自定义数据网格视图排序

如果不对网格使用数据源,则可以使用 DataGridView.SortCompare 事件,如下所示

void yourDataGridView_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
    if (e.Column.Name == "Id" && e.CellValue1 != null && e.CellValue2 != null)
    {
        var x = (int)e.CellValue1;
        var y = (int)e.CellValue2;
        e.SortResult = x == y ? 0 : x == 0 ? 1 : y == 0 ? -1 : x.CompareTo(y);
        e.Handled = true;
    }
}

不要忘记将事件处理程序附加到网格视图。

由于您没有提到DataGridView的数据源,因此我展示了一种集合的方法。例如,使用int[]但它适用于所有:

int[] collection = { 0, 0, 0, 5, 2, 7 };
int[] ordered = collection.OrderBy(i => i == 0).ThenBy(i => i).ToArray();

这是有效的,因为第一个OrderBy使用的比较可以是true的,也可以是false的。由于truefalse"高",因此所有不是0的都排在第一位。ThenBy用于非零组的内部排序。

如果这太抽象了,也许你会发现这更具可读性:

int[] ordered = collection.OrderBy(i => i != 0 ? 0 : 1).ThenBy(i => i).ToArray();