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