補充: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;
}
}