Можно ли это сделать с помощью сортировки
собственность 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;
}
Тогда я называю это так:
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
, а затем перепривязываете список, когда закончите. Помните Я не профилировал и не реорганизовал этот код, он может работать не так быстро, как вам хотелось бы, я просто хочу дать вам представление о том, что вы можете сделать, чтобы добиться решения.