DataGridViewColumn.SortMode属性为DataGridViewColumnSortMode.Automatic时,用 户点击列Header时,可以对列的内容进行排序。使用程序排序时,可以使用DataGridView.Sort方法实现。但排序后如果SortMode 属性为Automatic或Programmatic时,用户点击列Header时也可以进行排序。
补充:MSDN的「DataGridViewRowCollection.Add方法」, 添加新行时,控件中的行不自动排序。若要将新行排序为正确的位置,请在DataGridView.RowsAdded事件处理器中调用 System.Windows.Forms.DataGridView.Sort方法。可能还需要在CellValueChanged 事件处理器中调用 System.Windows.Forms.DataGridView.Sort方法,以便在用户修改单元格时对行进行排序。
下面的代码是,点击Button1时,当前单元格的列进行排序。如果当前列和已排序不是同一列时以升序排序的例子。
[VB.NET] '窗体的Load事件处理器 Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load '自动排序 Dim c As DataGridViewColumn For Each c In DataGridView1.Columns c.SortMode = DataGridViewColumnSortMode.Automatic Next c End Sub 'Button1的Click事件处理器 Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click If DataGridView1.CurrentCell Is Nothing Then Return End If '设定排序的列 Dim sortColumn As DataGridViewColumn = _ DataGridView1.CurrentCell.OwningColumn '设定排序的方向(升序、降序) Dim sortDirection As System.ComponentModel.ListSortDirection = _ System.ComponentModel.ListSortDirection.Ascending If Not (DataGridView1.SortedColumn Is Nothing) AndAlso _ DataGridView1.SortedColumn.Equals(sortColumn) Then sortDirection = IIf(DataGridView1.SortOrder = SortOrder.Ascending, _ System.ComponentModel.ListSortDirection.Descending, _ System.ComponentModel.ListSortDirection.Ascending) End If '进行排序 DataGridView1.Sort(sortColumn, sortDirection) End Sub
[C#] //窗体的Load事件处理器 private void Form1_Load(object sender, EventArgs e) { //自动排序 foreach (DataGridViewColumn c in DataGridView1.Columns) c.SortMode = DataGridViewColumnSortMode.Automatic; } // Button1的Click事件处理器 private void Button1_Click(object sender, EventArgs e) { if (DataGridView1.CurrentCell == null) return; //设定排序的列 DataGridViewColumn sortColumn = DataGridView1.CurrentCell.OwningColumn; //设定排序的方向(升序、降序) ListSortDirection sortDirection = ListSortDirection.Ascending; if (DataGridView1.SortedColumn != null && DataGridView1.SortedColumn.Equals(sortColumn)) { sortDirection = DataGridView1.SortOrder == SortOrder.Ascending ? ListSortDirection.Descending : ListSortDirection.Ascending; } //进行排序 DataGridView1.Sort(sortColumn, sortDirection); }
不能自动排序时也能自动排序
不能自动排序时,可以自己进行排序。也就是说当SortMode属性为Programmatic时,使用排序图标(在列Header右侧表示的,可以进行升序、降序排序的图标)进行排序。
列 Header点击时进行排序时是使用DataGridView.ColumnHeaderMouseClick事件处理器触发Sort方法实现的。在新行 追加后、单元格的值被编辑后,是使用RowsAdded或CellValueChanged事件处理器触发Sort方法实现。
排序的图标表示是通过DataGridViewColumnHeaderCell.SortGlyphDirection属性设定的。
[VB.NET] 'ColumnHeaderMouseClick事件处理器 Private Sub DataGridView1_ColumnHeaderMouseClick(ByVal sender As Object, _ ByVal e As DataGridViewCellMouseEventArgs) _ Handles DataGridView1.ColumnHeaderMouseClick Dim clickedColumn As DataGridViewColumn = _ DataGridView1.Columns(e.ColumnIndex) If clickedColumn.SortMode <> DataGridViewColumnSortMode.Automatic Then Me.SortRows(clickedColumn, True) End If End Sub 'RowsAdded事件处理器 Private Sub DataGridView1_RowsAdded(ByVal sender As Object, _ ByVal e As DataGridViewRowsAddedEventArgs) _ Handles DataGridView1.RowsAdded Me.SortRows(DataGridView1.SortedColumn, False) End Sub 'CellValueChanged事件处理器 Private Sub DataGridView1_CellValueChanged(ByVal sender As Object, _ ByVal e As DataGridViewCellEventArgs) _ Handles DataGridView1.CellValueChanged If Not (DataGridView1.SortedColumn Is Nothing) AndAlso _ e.ColumnIndex = DataGridView1.SortedColumn.Index Then Me.SortRows(DataGridView1.SortedColumn, False) End If End Sub ''' <summary> ''' 以被指定的列为标准进行排序 ''' </summary> ''' <param name="sortColumn">为标准的列</param> ''' <param name="orderToggle">变更排序方向的Toggle</param> Private Sub SortRows(ByVal sortColumn As DataGridViewColumn, _ ByVal orderToggle As Boolean) If sortColumn Is Nothing Then Return End If '清除前面的排序 If sortColumn.SortMode = DataGridViewColumnSortMode.Programmatic AndAlso _ Not (DataGridView1.SortedColumn Is Nothing) AndAlso _ Not DataGridView1.SortedColumn.Equals(sortColumn) Then DataGridView1.SortedColumn.HeaderCell.SortGlyphDirection = _ SortOrder.None End If '设定排序的方向(升序、降序) Dim sortDirection As System.ComponentModel.ListSortDirection If orderToggle Then sortDirection = IIf(DataGridView1.SortOrder = SortOrder.Descending, _ System.ComponentModel.ListSortDirection.Ascending, _ System.ComponentModel.ListSortDirection.Descending) Else sortDirection = IIf(DataGridView1.SortOrder = SortOrder.Descending, _ System.ComponentModel.ListSortDirection.Descending, _ System.ComponentModel.ListSortDirection.Ascending) End If Dim sOrder As SortOrder = _ IIf(sortDirection = System.ComponentModel.ListSortDirection.Ascending, _ SortOrder.Ascending, SortOrder.Descending) '进行排序 DataGridView1.Sort(sortColumn, sortDirection) If sortColumn.SortMode = DataGridViewColumnSortMode.Programmatic Then '变更排序图标 sortColumn.HeaderCell.SortGlyphDirection = sOrder End If End Sub
[C#] //窗体的Load事件处理器 private void Form1_Load(object sender, EventArgs e) { //事件处理器的追加 DataGridView1.RowsAdded += new DataGridViewRowsAddedEventHandler( DataGridView1_RowsAdded); DataGridView1.CellValueChanged += new DataGridViewCellEventHandler( DataGridView1_CellValueChanged); DataGridView1.ColumnHeaderMouseClick += new DataGridViewCellMouseEventHandler( DataGridView1_ColumnHeaderMouseClick); } //ColumnHeaderMouseClick事件处理器 private void DataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) { DataGridViewColumn clickedColumn = DataGridView1.Columns[e.ColumnIndex]; if (clickedColumn.SortMode != DataGridViewColumnSortMode.Automatic) this.SortRows(clickedColumn, true); } //RowsAdded事件处理器 private void DataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) { this.SortRows(DataGridView1.SortedColumn, false); } //CellValueChanged事件处理器 private void DataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) { if (DataGridView1.SortedColumn != null && e.ColumnIndex == DataGridView1.SortedColumn.Index) this.SortRows(DataGridView1.SortedColumn, false); } /// <summary> ///以被指定的列为标准进行排序 /// </summary> /// <param name="sortColumn">为标准的列</param> /// <param name="orderToggle">变更排序方向的Toggle </param> private void SortRows(DataGridViewColumn sortColumn, bool orderToggle) { if (sortColumn == null) return; //清除前面的排序 if (sortColumn.SortMode == DataGridViewColumnSortMode.Programmatic && DataGridView1.SortedColumn != null && !DataGridView1.SortedColumn.Equals(sortColumn)) { DataGridView1.SortedColumn.HeaderCell.SortGlyphDirection = SortOrder.None; } //设定排序的方向(升序、降序) ListSortDirection sortDirection; if (orderToggle) { sortDirection = DataGridView1.SortOrder == SortOrder.Descending ? ListSortDirection.Ascending : ListSortDirection.Descending; } else { sortDirection = DataGridView1.SortOrder == SortOrder.Descending ? ListSortDirection.Descending : ListSortDirection.Ascending; } SortOrder sortOrder = sortDirection == ListSortDirection.Ascending ? SortOrder.Ascending : SortOrder.Descending; //进行排序 DataGridView1.Sort(sortColumn, sortDirection); if (sortColumn.SortMode == DataGridViewColumnSortMode.Programmatic) { //变更排序图标 sortColumn.HeaderCell.SortGlyphDirection = sortOrder; } }