DataGridView.Sort Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Sortuje zawartość kontrolki DataGridView .
Przeciążenia
Sort(IComparer) |
Sortuje zawartość DataGridView kontrolki przy użyciu implementacji interfejsu IComparer . |
Sort(DataGridViewColumn, ListSortDirection) |
Sortuje zawartość kontrolki DataGridView w kolejności rosnącej lub malejącej na podstawie zawartości określonej kolumny. |
Sort(IComparer)
Sortuje zawartość DataGridView kontrolki przy użyciu implementacji interfejsu IComparer .
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)
Parametry
Wyjątki
comparer
to null
.
Przykłady
W poniższym przykładzie kodu pokazano, jak używać przeciążenia metody w scenariuszu Sort sortowania w wielu kolumnach. W tym przykładzie IComparerRowComparer
interfejs jest implementowany w klasie .
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
Uwagi
Ta metoda umożliwia zaawansowane dostosowywanie funkcji sortowania DataGridView klasy. Aby zaimplementować wysoce dostosowaną operację sortowania, można napisać procedurę obsługi zdarzeń dla ColumnHeaderMouseClick zdarzenia i wywołać tę metodę przy użyciu wystąpienia klasy, która implementuje System.Collections.IComparer interfejs jako parametr. W takim przypadku właściwość jest zwykle ustawiana DataGridViewColumn.SortMode tak, aby DataGridViewColumnSortMode.Programmatic wyłączyć automatyczne sortowanie i pozostawić miejsce na glif sortowania. Podczas sortowania według kolumn ustawionych na tryb sortowania programowego należy samodzielnie wyświetlić sortowanie, ustawiając DataGridViewColumnHeaderCell.SortGlyphDirection właściwość .
Ta metoda działa tylko wtedy, gdy właściwość nie jest ustawiona DataSource . Po powiązaniu kontrolki DataGridView z zewnętrznym źródłem danych należy użyć operacji sortowania dostarczonych przez to źródło danych. Po podaniu własnego źródła danych przez zaimplementowanie trybu wirtualnego należy również samodzielnie obsługiwać operacje sortowania.
Wywołanie tej metody automatycznie ustawia CurrentCell właściwość na null
.
Zobacz też
Dotyczy
Sort(DataGridViewColumn, ListSortDirection)
Sortuje zawartość kontrolki DataGridView w kolejności rosnącej lub malejącej na podstawie zawartości określonej kolumny.
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)
Parametry
- dataGridViewColumn
- DataGridViewColumn
Kolumna, według której należy posortować zawartość elementu DataGridView.
- direction
- ListSortDirection
Jedna z ListSortDirection wartości.
Wyjątki
Określona kolumna nie jest częścią tego DataGridViewelementu .
-lub-
Właściwość DataSource została ustawiona, a IsDataBound właściwość określonej kolumny zwraca false
wartość .
dataGridViewColumn
to null
.
Właściwość jest ustawiona VirtualMode na true
, a IsDataBound właściwość określonej kolumny zwraca false
wartość .
-lub-
Obiekt określony przez DataSource właściwość nie implementuje interfejsu IBindingList .
-lub-
Obiekt określony przez DataSource właściwość ma SupportsSorting wartość false
właściwości .
Przykłady
W poniższym przykładzie kodu pokazano, jak używać Sort elementu w sortowaniu programowym.
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
Uwagi
Ta metoda sortuje zawartość obiektu DataGridView , porównując wartości w określonej kolumnie. Domyślnie operacja sortowania będzie używać Compare metody do porównywania par komórek w kolumnie przy użyciu DataGridViewCell.Value właściwości .
W przypadku kolumn z właściwością ustawioną na SortModeDataGridViewColumnSortMode.AutomaticSortedColumn wartość , właściwości i SortOrder są ustawiane automatycznie i wyświetlane są odpowiednie glif sortowania. W przypadku kolumn z właściwością ustawioną na SortModeDataGridViewColumnSortMode.Programmatic, musisz wyświetlić sortowanie samodzielnie za pośrednictwem DataGridViewColumnHeaderCell.SortGlyphDirection właściwości .
Operację sortowania używaną przez tę metodę można dostosować, obsługując SortCompare zdarzenie. To zdarzenie występuje tylko wtedy, gdy DataSource właściwość nie została ustawiona.
Po ustawieniu DataSource właściwości ta metoda działa tylko dla kolumn powiązanych z danymi. Kolumny powiązane z danymi miały zestaw DataGridViewColumn.DataPropertyName właściwości.
DataGridViewColumn.IsDataBound Powoduje to zwrócenie true
właściwości .
Jeśli kontrolka DataGridView zawiera kolumny powiązane i niezwiązane, należy zaimplementować tryb wirtualny, aby zachować wartości kolumn bez ruchu przychodzącego, gdy kontrolka jest sortowana według powiązanej kolumny. Można to zrobić, ustawiając VirtualMode właściwość na true
i obsługując CellValueNeeded zdarzenie. Jeśli kolumna jest edytowalna, należy również obsłużyć CellValuePushed zdarzenie. Aby uzyskać więcej informacji na temat trybu wirtualnego, zobacz Instrukcje: implementowanie trybu wirtualnego w kontrolce DataGridView Windows Forms. Sortowanie według kolumn niezwiązanych, gdy kontrolka jest powiązana z danymi, nie jest obsługiwana.
Zobacz też
Dotyczy
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla