Freigeben über


DataGridView.Sort Methode

Definition

Sortiert den Inhalt des DataGridView-Steuerelements.

Überlädt

Sort(IComparer)

Sortiert den Inhalt des DataGridView-Steuerelements mit einer Implementierung der IComparer-Schnittstelle.

Sort(DataGridViewColumn, ListSortDirection)

Sortiert den Inhalt des DataGridView-Steuerelements in aufsteigender oder absteigender Reihenfolge auf Grundlage des Inhalts der angegebenen Spalte.

Sort(IComparer)

Quelle:
DataGridView.Methods.cs
Quelle:
DataGridView.Methods.cs
Quelle:
DataGridView.Methods.cs

Sortiert den Inhalt des DataGridView-Steuerelements mit einer Implementierung der IComparer-Schnittstelle.

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)

Parameter

comparer
IComparer

Eine Implementierung des IComparer, der die benutzerdefinierte Sortieroperation ausführt.

Ausnahmen

comparer ist null.

Für VirtualMode ist true festgelegt.

- oder -

DataSource ist nicht null.

Beispiele

Im folgenden Codebeispiel wird veranschaulicht, wie die Sort Methodenüberladung in einem Szenario zur Sortierung mehrerer Spalten verwendet wird. In diesem Beispiel wird die IComparer -Schnittstelle in der RowComparer -Klasse implementiert.

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

Hinweise

Diese Methode ermöglicht eine erweiterte Anpassung des Sortierfeatures der DataGridView -Klasse. Um einen hochgradig angepassten Sortiervorgang zu implementieren, können Sie einen Ereignishandler für das ColumnHeaderMouseClick Ereignis schreiben und diese Methode mit einer instance einer Klasse aufrufen, die die System.Collections.IComparer Schnittstelle als Parameter implementiert. In diesem Fall legen Sie die Eigenschaft in der Regel auf festDataGridViewColumnSortMode.Programmatic, um die DataGridViewColumn.SortMode automatische Sortierung zu deaktivieren und Platz für eine Sortiersymbole zu lassen. Wenn Sie nach Spalten sortieren, die auf den programmgesteuerten Sortiermodus festgelegt sind, müssen Sie die Sortiersymbole selbst anzeigen, indem Sie die DataGridViewColumnHeaderCell.SortGlyphDirection -Eigenschaft festlegen.

Diese Methode funktioniert nur, wenn die DataSource -Eigenschaft nicht festgelegt ist. Wenn Sie das DataGridView Steuerelement an eine externe Datenquelle binden, müssen Sie die sortiervorgänge verwenden, die von dieser Datenquelle bereitgestellt werden. Wenn Sie Ihre eigene Datenquelle bereitstellen, indem Sie den virtuellen Modus implementieren, müssen Sie auch die Sortiervorgänge selbst verarbeiten.

Durch Aufrufen dieser Methode wird die CurrentCell -Eigenschaft automatisch auf nullfestgelegt.

Weitere Informationen

Gilt für:

Sort(DataGridViewColumn, ListSortDirection)

Quelle:
DataGridView.Methods.cs
Quelle:
DataGridView.Methods.cs
Quelle:
DataGridView.Methods.cs

Sortiert den Inhalt des DataGridView-Steuerelements in aufsteigender oder absteigender Reihenfolge auf Grundlage des Inhalts der angegebenen Spalte.

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)

Parameter

dataGridViewColumn
DataGridViewColumn

Die Spalte, nach der der Inhalt der DataGridView sortiert werden soll.

direction
ListSortDirection

Einer der ListSortDirection-Werte.

Ausnahmen

Die angegebene Spalte ist nicht Teil dieses DataGridView.

- oder -

Die DataSource-Eigenschaft wurde festgelegt, und die IsDataBound-Eigenschaft der angegebenen Spalte gibt false zurück.

dataGridViewColumn ist null.

Die VirtualMode -Eigenschaft wurde auf true festgelegt, und die IsDataBound -Eigenschaft der angegebenen Spalte gibt falsezurück.

- oder -

Das von der DataSource-Eigenschaft angegebene Objekt implementiert nicht die IBindingList-Schnittstelle.

- oder -

Das von der DataSource-Eigenschaft angegebene Objekt besitzt den SupportsSorting-Eigenschaftswert von false.

Beispiele

Im folgenden Codebeispiel wird veranschaulicht, wie sie Sort in einer programmgesteuerten Sortierung verwendet wird.

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

Hinweise

Diese Methode sortiert den Inhalt von DataGridView , indem Werte in der angegebenen Spalte verglichen werden. Standardmäßig verwendet der Sortiervorgang die Compare -Methode, um Zellenpaare in der Spalte mithilfe der DataGridViewCell.Value -Eigenschaft zu vergleichen.

Für Spalten, deren SortMode Eigenschaft auf DataGridViewColumnSortMode.Automaticfestgelegt ist, werden die SortedColumn Eigenschaften und SortOrder automatisch festgelegt, und die entsprechende Sortiersymbolvorlage wird angezeigt. Für Spalten, deren SortMode Eigenschaft auf DataGridViewColumnSortMode.Programmaticfestgelegt ist, müssen Sie die Sortiersymbole selbst über die DataGridViewColumnHeaderCell.SortGlyphDirection -Eigenschaft anzeigen.

Sie können den von dieser Methode verwendeten Sortiervorgang anpassen, indem Sie das SortCompare Ereignis behandeln. Dieses Ereignis tritt nur auf, wenn die DataSource Eigenschaft nicht festgelegt wurde.

Wenn die DataSource -Eigenschaft festgelegt wurde, funktioniert diese Methode nur für datengebundene Spalten. Für datengebundene Spalten wurde ihre DataGridViewColumn.DataPropertyName -Eigenschaft festgelegt. Dies bewirkt, dass die DataGridViewColumn.IsDataBound -Eigenschaft zurückgibt true.

Wenn das DataGridView Steuerelement sowohl gebundene als auch ungebundene Spalten enthält, müssen Sie den virtuellen Modus implementieren, um die Werte der ungebundenen Spalten beizubehalten, wenn das Steuerelement nach einer gebundenen Spalte sortiert wird. Hierzu können Sie die VirtualMode -Eigenschaft auf true festlegen und das CellValueNeeded Ereignis behandeln. Wenn die Spalte bearbeitbar ist, sollten Sie auch das CellValuePushed -Ereignis behandeln. Weitere Informationen zum virtuellen Modus finden Sie unter Vorgehensweise: Implementieren des virtuellen Modus im Windows Forms DataGridView-Steuerelements. Das Sortieren nach ungebundenen Spalten, wenn das Steuerelement datengebunden ist, wird nicht unterstützt.

Weitere Informationen

Gilt für: