tec*_*anc 5 c# sorting datagridview
我在Winforms应用程序中有一个DataGridView。我想在其中选择一组行,然后按列对这些行进行排序(时间戳)...
其余各行应保持原始状态。.可以使用DGV的sort属性完成此操作
谢谢
这可以使用 DGV 的排序属性来完成吗
不
上的Sort方法用于DataGridView更简单的排序。例如升序或降序排序,该SortOrder属性也仅用于“简单”排序。
这种行为可以实施吗?当然。
我认为最简单的方法是:
DataGridView但是,您需要考虑如果您选择的项目彼此不跟随,您需要如何处理,例如,如果您选择索引,{ 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,然后在完成后重新绑定列表。请记住,我还没有分析或重构此代码,它可能没有您想要的那么快,我只是想让您了解可以采取哪些措施来实现解决方案。