对DataGridView中的选定行进行排序

tec*_*anc 5 c# sorting datagridview

我在Winforms应用程序中有一个DataGridView。我想在其中选择一组行,然后按列对这些行进行排序(时间戳)...

其余各行应保持原始状态。.可以使用DGV的sort属性完成此操作

谢谢

Fil*_*erg 3

这可以使用 DGV 的排序属性来完成吗

上的Sort方法用于DataGridView更简单的排序。例如升序或降序排序,该SortOrder属性也仅用于“简单”排序。

这种行为可以实施吗?当然。

我认为最简单的方法是:

  • 存储第一个选定项目的索引
  • 从列表中取出您想要排序的项目DataGridView
  • 使用 LINQ 对列表进行排序
  • 追加两个列表,并将排序后的列表添加到第一步中存储的索引处。

但是,您需要考虑如果您选择的项目彼此不跟随,您需要如何处理,例如,如果您选择索引,{ 1, 3, 6, 9 }您可能仍然希望将其附加到索引1

编辑

好的,我对此进行了一些尝试,并想出了一种可以实现此功能的方法。它不是很优化,但您会明白我的意思。

首先这是SortSelectedIndices我使用的方法:

static IEnumerable<T> SortSelectedIndices<T>(
    IEnumerable<T> values, 
    IEnumerable<int> selectedIndices, 
    Func<IEnumerable<T>, IEnumerable<T>> sort)
{
    var selectedValues = new List<T>();

    for (var i = 0; i < selectedIndices.Count(); i++)
        selectedValues.Add(values.ElementAt(selectedIndices.ElementAt(i)));

    var sortedList = sort(selectedValues);

    var finalList = new List<T>();

    var startPositionFound = false;
    for(var i = 0; i < values.Count(); i++)
    {
        if (selectedIndices.Contains(i))
        {
            if (startPositionFound) continue;

            startPositionFound = true;
            finalList.AddRange(sortedList);
        }
        else
            finalList.Add(values.ElementAt(i));
    }

    return finalList;
}
Run Code Online (Sandbox Code Playgroud)

然后我这样称呼它:

static void Main(string[] args)
{
    var unsorted = new[] {3, 5, 6, 1, 2, 87, 432, 23, 46, 98, 44};
    var selected = new[] {1, 4, 7};

    Print(unsorted);

    var sort = new Func<IEnumerable<int>, IEnumerable<int>>(
        (x) => x.OrderBy(y => y).ToList());

    var sorted = SortSelectedIndices(unsorted, selected, sort);

    Print(sorted);
}
Run Code Online (Sandbox Code Playgroud)

这会打印出以下内容:

{ 3,5,6,1,2,87,432,23,46,98,44 }
{ 3,2,5,23,6,1,87,432,46,98,44 }
Run Code Online (Sandbox Code Playgroud)

我在这里只是使用一个简单的方法将其打印到控制台:

static void Print<T>(IEnumerable<T> values)
{
    Console.Write("{ ");
    Console.Write(string.Join(",", values));
    Console.WriteLine(" }");
}
Run Code Online (Sandbox Code Playgroud)

因此,您可以做的是有一个“排序”按钮,按下该按钮时,您可以调用该按钮SortSelectedIndices,然后在完成后重新绑定列表。请记住,我还没有分析或重构此代码,它可能没有您想要的那么快,我只是想让您了解可以采取哪些措施来实现解决方案。