基于字符串的自定义排序

时间:2019-07-15 19:00:35

标签: c# winforms sorting visual-studio-2015 datagridview

我想基于“产品名称”列值对DataGrid视图中的行进行排序。因此,例如,上述列的可能值为:“模块”,“ RX5000”,“ RM5000”。如果我的gridview有10行,并且“产品名称”列具有以下顺序的值:

RX5000
RM5000
RM5000
Module
RX5000
RX5000
RM5000
Module
RX5000
RM5000

单击按钮后,我希望它们按以下顺序显示(在同一gridview中显示):

Module
Module
RX5000
RX5000
RX5000
RX5000
RM5000
RM5000
RM5000
RM5000

我如何在C#中获得它?

我想到了创建每种产品的列表,然后遍历每一行并根据产品名称填充列表,然后以某种方式将3个列表合并为第4个列表,然后将第4个列表分配给我的mergeview 。但是我有12个产品(我在这里只显示3个),所以我不想有12个列表。我希望它更具动态性。

private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
    string cell1, cell2;

    if (e.Column == "Your_Column")
    {
        if (e.CellValue1 == null) cell1 = "";
        else cell1 = e.CellValue1.ToString();

        if (e.CellValue2 == null) cell2 = "";
        else cell2 = e.CellValue2.ToString();

        if (cell1 == "Account Manager") { e.SortResult = -1; e.Handled = true; }
        else
        {
            if (cell2 == "Account Manager") { e.SortResult = 1; e.Handled = true; }
            else
            {
                if (cell1 == "Assistant Account Manager") { e.SortResult = -1; e.Handled = true; }
                else
                {
                    if (cell2 == "Assistant Account Manager") { e.SortResult = 1; e.Handled = true; }
                }
            }
        }
    }
}

我在不同的Post中找到了上面的代码,但是我不知道如何将其应用于我的问题,甚至不知道是否可以将其应用于我的问题。

1 个答案:

答案 0 :(得分:0)

The answer you found是最大的难题:您需要订阅并处理DataGridView.SortCompare事件。不幸的是,您在此处找到的代码非常特定于该特定场景。它假定最多有一个“特殊”名称,并且对其余名称没有任何特殊的顺序。

在您的示例中,尚不清楚为什么要订购"RX5000"使其位于"RM5000"之前。正常的字母排序将使它们颠倒。但是,假设与“正常字母排序”的偏差确实是您的问题,那么您需要做的就是定义所需的顺序,然后在事件处理程序SortCompare中引用该顺序。

例如,您可以执行以下操作:

private readonly Dictionary<string, int> _sortOrder = new[] { "Module", "RX5000", "RM5000" }
    .Select((s, i) => new KeyValuePair<string, int>(s, i))
    .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
    e.SortResult = _sortOrder[e.CellValue1.ToString()].CompareTo(_sortOrder[e.CellValue2.ToString()]);
    e.Handled = true;
}

_sortOrder_字典是通过枚举一个数组元素来构造的,您可以按照要对其进行排序的顺序将它们定义为字符串,并使用字符串值及其在数组中的索引来创建用于初始化字典的键/值对。这样具有为字符串分配特定数值的效果,其顺序与您希望对字符串进行排序的顺序相同。

然后声明dataGridView1_SortCompare()方法,该方法的实现是将比较简单地委派给分配给字符串的数值的比较。即从_sortOrder检索第一个单元格的字符串表示形式的数值,并将该值与第二个单元格的字符串表示形式的数值(也从_sortOrder检索出来)进行比较。