基于字符串的自定义排序

Custom Sorting Based on strings

我想根据 "Product Name" 列值对 DataGrid 视图中的行进行排序。因此,例如,上述列的可能值为:"Module"、"RX5000"、"RM5000"。如果我的 gridview 有 10 行,并且 "Product Name" 列具有以下顺序的值:

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 个列表分配给我的合并视图。但是我有 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 中找到了上面的代码,但我不知道如何将其应用到我的问题中,或者是否可以将其应用到我的问题中。

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

在您的示例中,不清楚为什么要对 "RX5000" 进行排序,使其排在 "RM5000" 之前。正常的字母排序会将它们颠倒过来。但是,假设与 "normal alphabetic sort" 的偏差正是您的问题,那么您需要做的就是定义所需的顺序,然后在 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_ 字典是通过枚举数组元素构建的,您将数组元素定义为按您希望它们排序的顺序排列的字符串,并使用字符串值及其在数组中的索引创建用于初始化字典的 key/value 对。这具有将特定数值分配给字符串的效果,按照您希望对字符串进行排序的相同顺序。

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