c# - 对 DataGridView 中的选定行进行排序

标签 c# sorting datagridview

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

其余行应保持原样。 这可以使用 DGV 的排序属性来完成吗

谢谢

最佳答案

Can this be done using the sort property of DGV

Sort method 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;
}

然后我这样调用它:

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);
}

这会打印出以下内容:

{ 3,5,6,1,2,87,432,23,46,98,44 }
{ 3,2,5,23,6,1,87,432,46,98,44 }

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

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

所以您可以做的是拥有一个“排序”按钮,按下它时您调用 SortSelectedIndices,然后在完成后重新绑定(bind)列表。 记住我没有分析或重构这段代码,它可能没有你喜欢的那么快,我只是想给你一个想法,告诉你你可以做些什么来实现这个解决方案。

关于c# - 对 DataGridView 中的选定行进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6616633/

相关文章:

r - ggplot barplot 根据两个类别的行的最大值进行排序

c# - 共享滚动位置、共享数据源但不同步滚动位置的两个数据网格

c# - 在哪里放置测试数据?

c# - Azure 函数从配置访问连接字符串

php - 按列对平面文件中的数据进行排序

java - MongoDB Java 驱动程序 : distinct with sort

c# - 如何清除 DataGridView 以便新数据可以填充单元格?

c# - DataGridView 行添加事件

c# - 在XML文件中包含所有错误代码和消息并在代码中使用该文件进行记录是否可以?

c# - 还有哪些其他语言支持 Go 的接口(interface)风格而无需显式声明?