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;
     }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值