datagridview 列排序问题

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;
     }
 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章