我如何实现DataGridView的自动sorting?

我正在编程添加列到DataGridView,然后绑定到列表。 默认情况下,列的SortMode是自动的。 但是当我运行我的应用程序,点击标题什么都不做。 上/下箭头不显示。 从阅读MSDN,关于自动sorting并不多。 他们进入更多关于程序化sorting的细节。 所以,我假设自动方式应该很容易。 MSDN继续说:“ 除非使用列标题进行select否则单击列标题将自动按此列对DataGridView进行sorting,并显示指示sorting顺序的字形。 这到底是什么意思? 我可以设置与sorting冲突的网格属性吗? 我错过了什么?

AutoGenerateColumns = false; AllowUserToAddRows = false; AllowUserToDeleteRows = false; AllowUserToResizeRows = false; AllowUserToResizeColumns = false; ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing; ReadOnly = true; MultiSelect = false; RowHeadersVisible = false; SelectionMode = DataGridViewSelectionMode.FullRowSelect; CellBorderStyle = DataGridViewCellBorderStyle.None; DataGridViewTextBoxColumn idColumn = new DataGridViewTextBoxColumn(); idColumn.HeaderText = "ID"; idColumn.DataPropertyName = "IDNumber"; DataGridViewTextBoxColumn nameColumn = new DataGridViewTextBoxColumn(); nameColumn.HeaderText = "Name"; nameColumn.DataPropertyName = "Description"; DataGridViewTextBoxColumn lastModifiedColumn = new DataGridViewTextBoxColumn(); lastModifiedColumn.HeaderText = "Last Modified"; lastModifiedColumn.DataPropertyName = "Date"; Columns.Add(idColumn); Columns.Add(nameColumn); Columns.Add(lastModifiedColumn); List<IMyObject> bindingList = GetMyList(); DataSource = bindingList; 

我们使用BindingListView将List <T> s绑定到DataGridViews,并且它对我们来说非常合适。

下面是一个非常简单的创build对象列表视图的例子(在C#中):

 List<Customer> customers = GetCustomers(); BindingListView<Customer> view = new BindingListView<Customer>(customers); dataGridView1.DataSource = view; 

查看https://stackoverflow.com/a/17952576/116891了解关于DGVsorting和数据绑定的更多详细信息。;

如果你不想添加重量,你可以尝试一个SortableBindingList <T>的实现 ( 带更新 )。

两者都可以让你立即进行sorting,根据基准,BindingListView甚至比DataViews更快。

我想我find了答案。 我的数据源实现IList<T> 。 显然它需要实现IBindingList<T> 。 不幸的是,我无法testing这个。

我find的最佳解决scheme:

编辑:自发布以来,我发现SortableBindingList(Of T)这个实现是最好的解决scheme,除了我修改第52行是IEnumerable而不是ICollection ,因为构造函数无论如何是铸造,它的工作原理。

或者,下面的解决scheme不需要自定义类:

DataGridView可能没有实现自定义类的sorting。 请注意,我的代码是在VB.NET中,但它应该翻译。 数据必须首先添加到grid.Rows

 For Each item In dataList grid.Rows.Add(item.Id, item.Name, item.DateProperty) Next 

然后实现这些事件处理程序。 第二个是确保datesorting工作。 你只需要它,如果你的网格将有一个可sorting的date列:

 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