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.SortMode 為 DataGridViewColumnSortMode.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 屬性所指定的物件具有 false
的 SupportsSorting 屬性值。
範例
下列程式碼範例示範如何在程式設計排序中使用 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 屬性來比較資料行中的儲存格組。
對於屬性設定為 的資料 SortMode 行, SortedColumn 會自動設定 和 SortOrder 屬性,並顯示適當的排序 DataGridViewColumnSortMode.Automatic 字元。 對於屬性設定 DataGridViewColumnSortMode.Programmatic 為 的資料 SortMode 行,您必須透過 DataGridViewColumnHeaderCell.SortGlyphDirection 屬性自行顯示排序字元。
您可以藉由處理 SortCompare 事件,自訂此方法所使用的排序作業。 只有當屬性尚未設定時, DataSource 才會發生這個事件。
DataSource設定屬性之後,這個方法僅適用于資料系結資料行。 資料系結資料行已設定其 DataGridViewColumn.DataPropertyName 屬性。 這會導致 DataGridViewColumn.IsDataBound 屬性傳回 true
。
DataGridView如果您的控制項同時包含系結和未系結的資料行,您必須實作虛擬模式,以在控制項依系結資料行排序時維護未系結資料行的值。 您可以藉由將 VirtualMode 屬性設定為 true
並處理 CellValueNeeded 事件來執行此動作。 如果資料行是可編輯的,您也應該處理 CellValuePushed 事件。 如需虛擬模式的詳細資訊,請參閱How to: Implement Virtual Mode in the Windows Forms DataGridView Control。 不支援控制項系結時,依未系結資料行排序。
另請參閱
適用於
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應