DataGridView.Sort 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
对 DataGridView 控件的内容进行排序。
重载
Sort(IComparer) |
使用 IComparer 接口的实现来对 DataGridView 控件的内容进行排序。 |
Sort(DataGridViewColumn, ListSortDirection) |
基于指定列的内容,按升序或降序对 DataGridView 控件的内容进行排序。 |
Sort(IComparer)
使用 IComparer 接口的实现来对 DataGridView 控件的内容进行排序。
public:
virtual void Sort(System::Collections::IComparer ^ comparer);
public virtual void Sort (System.Collections.IComparer comparer);
abstract member Sort : System.Collections.IComparer -> unit
override this.Sort : System.Collections.IComparer -> unit
Public Overridable Sub Sort (comparer As IComparer)
参数
例外
comparer
为 null
。
示例
下面的代码示例演示如何在多列排序方案中使用 Sort 方法重载。 在此示例中, IComparer 接口在 类中 RowComparer
实现。
private void Button1_Click( object sender, EventArgs e )
{
if ( RadioButton1.Checked == true )
{
DataGridView1.Sort( new RowComparer( SortOrder.Ascending ) );
}
else if ( RadioButton2.Checked == true )
{
DataGridView1.Sort( new RowComparer( SortOrder.Descending ) );
}
}
private class RowComparer : System.Collections.IComparer
{
private static int sortOrderModifier = 1;
public RowComparer(SortOrder sortOrder)
{
if (sortOrder == SortOrder.Descending)
{
sortOrderModifier = -1;
}
else if (sortOrder == SortOrder.Ascending)
{
sortOrderModifier = 1;
}
}
public int Compare(object x, object y)
{
DataGridViewRow DataGridViewRow1 = (DataGridViewRow)x;
DataGridViewRow DataGridViewRow2 = (DataGridViewRow)y;
// Try to sort based on the Last Name column.
int CompareResult = System.String.Compare(
DataGridViewRow1.Cells[1].Value.ToString(),
DataGridViewRow2.Cells[1].Value.ToString());
// If the Last Names are equal, sort based on the First Name.
if ( CompareResult == 0 )
{
CompareResult = System.String.Compare(
DataGridViewRow1.Cells[0].Value.ToString(),
DataGridViewRow2.Cells[0].Value.ToString());
}
return CompareResult * sortOrderModifier;
}
}
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) _
Handles Button1.Click
If RadioButton1.Checked = True Then
DataGridView1.Sort(New RowComparer(SortOrder.Ascending))
ElseIf RadioButton2.Checked = True Then
DataGridView1.Sort(New RowComparer(SortOrder.Descending))
End If
End Sub
Private Class RowComparer
Implements System.Collections.IComparer
Private sortOrderModifier As Integer = 1
Public Sub New(ByVal sortOrder As SortOrder)
If sortOrder = sortOrder.Descending Then
sortOrderModifier = -1
ElseIf sortOrder = sortOrder.Ascending Then
sortOrderModifier = 1
End If
End Sub
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer _
Implements System.Collections.IComparer.Compare
Dim DataGridViewRow1 As DataGridViewRow = CType(x, DataGridViewRow)
Dim DataGridViewRow2 As DataGridViewRow = CType(y, DataGridViewRow)
' Try to sort based on the Last Name column.
Dim CompareResult As Integer = System.String.Compare( _
DataGridViewRow1.Cells(1).Value.ToString(), _
DataGridViewRow2.Cells(1).Value.ToString())
' If the Last Names are equal, sort based on the First Name.
If CompareResult = 0 Then
CompareResult = System.String.Compare( _
DataGridViewRow1.Cells(0).Value.ToString(), _
DataGridViewRow2.Cells(0).Value.ToString())
End If
Return CompareResult * sortOrderModifier
End Function
End Class
注解
此方法允许对 类的排序功能 DataGridView 进行高级自定义。 若要实现高度自定义的排序操作,可以为 事件编写事件处理程序 ColumnHeaderMouseClick ,并使用将 接口作为参数实现 System.Collections.IComparer 的类的实例调用此方法。 在这种情况下,通常会将 属性设置为 DataGridViewColumn.SortModeDataGridViewColumnSortMode.Programmatic 以禁用自动排序并为排序字形留出空间。 按设置为编程排序模式的列排序时,必须通过设置 DataGridViewColumnHeaderCell.SortGlyphDirection 属性自行显示排序字形。
仅当未设置 属性时, DataSource 此方法才有效。 将 DataGridView 控件绑定到外部数据源时,必须使用该数据源提供的排序操作。 通过实现虚拟模式提供自己的数据源时,还必须自行处理排序操作。
调用此方法会自动将 CurrentCell 属性设置为 null
。
另请参阅
适用于
Sort(DataGridViewColumn, ListSortDirection)
基于指定列的内容,按升序或降序对 DataGridView 控件的内容进行排序。
public:
virtual void Sort(System::Windows::Forms::DataGridViewColumn ^ dataGridViewColumn, System::ComponentModel::ListSortDirection direction);
public virtual void Sort (System.Windows.Forms.DataGridViewColumn dataGridViewColumn, System.ComponentModel.ListSortDirection direction);
abstract member Sort : System.Windows.Forms.DataGridViewColumn * System.ComponentModel.ListSortDirection -> unit
override this.Sort : System.Windows.Forms.DataGridViewColumn * System.ComponentModel.ListSortDirection -> unit
Public Overridable Sub Sort (dataGridViewColumn As DataGridViewColumn, direction As ListSortDirection)
参数
- dataGridViewColumn
- DataGridViewColumn
对 DataGridView 的内容进行排序时所依据的列。
- direction
- ListSortDirection
ListSortDirection 值之一。
例外
dataGridViewColumn
为 null
。
VirtualMode 属性设置为 true
,而指定列的 IsDataBound 属性返回 false
。
- 或 -
DataSource 属性指定的对象未实现 IBindingList 接口。
- 或 -
DataSource 属性指定的对象的 SupportsSorting 属性值为 false
。
示例
下面的代码示例演示如何以编程方式使用 Sort 。
private void sortButton_Click(object sender, System.EventArgs e)
{
// Check which column is selected, otherwise set NewColumn to null.
DataGridViewColumn newColumn =
dataGridView1.Columns.GetColumnCount(
DataGridViewElementStates.Selected) == 1 ?
dataGridView1.SelectedColumns[0] : null;
DataGridViewColumn oldColumn = dataGridView1.SortedColumn;
ListSortDirection direction;
// If oldColumn is null, then the DataGridView is not currently sorted.
if (oldColumn != null)
{
// Sort the same column again, reversing the SortOrder.
if (oldColumn == newColumn &&
dataGridView1.SortOrder == SortOrder.Ascending)
{
direction = ListSortDirection.Descending;
}
else
{
// Sort a new column and remove the old SortGlyph.
direction = ListSortDirection.Ascending;
oldColumn.HeaderCell.SortGlyphDirection = SortOrder.None;
}
}
else
{
direction = ListSortDirection.Ascending;
}
// If no column has been selected, display an error dialog box.
if (newColumn == null)
{
MessageBox.Show("Select a single column and try again.",
"Error: Invalid Selection", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
else
{
dataGridView1.Sort(newColumn, direction);
newColumn.HeaderCell.SortGlyphDirection =
direction == ListSortDirection.Ascending ?
SortOrder.Ascending : SortOrder.Descending;
}
}
Private Sub SortButton_Click(ByVal sender As Object, _
ByVal e As EventArgs) Handles sortButton.Click
' Check which column is selected, otherwise set NewColumn to Nothing.
Dim newColumn As DataGridViewColumn
If dataGridView1.Columns.GetColumnCount(DataGridViewElementStates _
.Selected) = 1 Then
newColumn = dataGridView1.SelectedColumns(0)
Else
newColumn = Nothing
End If
Dim oldColumn As DataGridViewColumn = dataGridView1.SortedColumn
Dim direction As ListSortDirection
' If oldColumn is null, then the DataGridView is not currently sorted.
If oldColumn IsNot Nothing Then
' Sort the same column again, reversing the SortOrder.
If oldColumn Is newColumn AndAlso dataGridView1.SortOrder = _
SortOrder.Ascending Then
direction = ListSortDirection.Descending
Else
' Sort a new column and remove the old SortGlyph.
direction = ListSortDirection.Ascending
oldColumn.HeaderCell.SortGlyphDirection = SortOrder.None
End If
Else
direction = ListSortDirection.Ascending
End If
' If no column has been selected, display an error dialog box.
If newColumn Is Nothing Then
MessageBox.Show("Select a single column and try again.", _
"Error: Invalid Selection", MessageBoxButtons.OK, _
MessageBoxIcon.Error)
Else
dataGridView1.Sort(newColumn, direction)
If direction = ListSortDirection.Ascending Then
newColumn.HeaderCell.SortGlyphDirection = SortOrder.Ascending
Else
newColumn.HeaderCell.SortGlyphDirection = SortOrder.Descending
End If
End If
End Sub
注解
此方法通过比较指定列中的值对 的内容 DataGridView 进行排序。 默认情况下,排序操作将使用 Compare 方法通过 属性比较列中 DataGridViewCell.Value 的单元格对。
对于 属性设置为 DataGridViewColumnSortMode.Automatic的SortMode列,SortedColumn将自动设置 和 SortOrder 属性,并显示相应的排序字形。 对于 属性设置为 DataGridViewColumnSortMode.Programmatic的SortMode列,必须通过 DataGridViewColumnHeaderCell.SortGlyphDirection 属性自行显示排序字形。
可以通过处理 SortCompare 事件来自定义此方法使用的排序操作。 仅当尚未设置 属性时, DataSource 才会发生此事件。
DataSource设置 属性后,此方法仅适用于数据绑定列。 数据绑定列已设置其 DataGridViewColumn.DataPropertyName 属性。 这会导致 属性 DataGridViewColumn.IsDataBound 返回 true
。
DataGridView如果控件同时包含绑定列和未绑定列,则必须实现虚拟模式,以在控件按绑定列排序时保留未绑定列的值。 可以通过将 VirtualMode 属性 true
设置为 并处理 事件来 CellValueNeeded 执行此操作。 如果该列是可编辑的,则还应处理 事件 CellValuePushed 。 有关虚拟模式的详细信息,请参阅如何:在 Windows 窗体 DataGridView 控件中实现虚拟模式。 不支持在控件数据绑定时按未绑定列排序。