我在 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/