Лучшее решение, которое я нашел:
РЕДАКТИРОВАТЬ: С момента публикации я нашел эту реализацию SortableBindingList(Of T)
лучшим решением, за исключением того, что я изменил строку 52, чтобы она была IEnumerable
, а не ICollection
, так как конструктор в любом случае работает, и он работает.
В качестве альтернативы для решения ниже не требуется пользовательский класс:
DataGridView
может быть отсортирован без реализации пользовательского класса. Обратите внимание, что мой код находится в VB.NET, но он должен быть переведен. Сначала необходимо добавить данные в grid.Rows
:
For Each item In dataList
grid.Rows.Add(item.Id, item.Name, item.DateProperty)
Next
Затем реализуйте эти обработчики событий. Второй - убедиться, что сортировка по дате работает. Он нужен только в том случае, если в вашей сетке будет столбец сортируемых дат:
Private Sub grid_ColumnHeaderMouseClick(ByVal sender As Object, ByVal e As DataGridViewCellMouseEventArgs) Handles grid.ColumnHeaderMouseClick
Dim col = grid.Columns(e.ColumnIndex)
Dim dir As System.ComponentModel.ListSortDirection
Select Case col.HeaderCell.SortGlyphDirection
Case SortOrder.None, SortOrder.Ascending
dir = System.ComponentModel.ListSortDirection.Ascending
Case Else
dir = System.ComponentModel.ListSortDirection.Descending
End Select
grid.Sort(col, dir)
End Sub
Private Sub grid_SortCompare(ByVal sender As Object, ByVal e As DataGridViewSortCompareEventArgs) Handles grid.SortCompare
'This event occurs only when the DataSource property is not set and the VirtualMode property value is false.
If e.Column.Name = "DateProperty" Then
e.SortResult = Date.Compare(CType(e.CellValue1, Date), CType(e.CellValue2, Date))
e.Handled = True
End If
End Sub
Важно отметить, что только свойства, которые вы добавляете в строку, являются частью результирующего объекта, поскольку привязка отсутствует. Чтобы сохранить весь ваш объект, вам нужно будет добавить столбцы для каждого свойства, задав для всех столбцов значение Visible = False
.