DataGridView.Sort Méthode

Définition

Trie le contenu du contrôle DataGridView.

Surcharges

Sort(IComparer)

Trie le contenu du contrôle DataGridView à l’aide d’une implémentation de l’interface IComparer.

Sort(DataGridViewColumn, ListSortDirection)

Trie le contenu du contrôle DataGridView dans l’ordre croissant ou décroissant en fonction du contenu de la colonne spécifiée.

Sort(IComparer)

Trie le contenu du contrôle DataGridView à l’aide d’une implémentation de l’interface 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)

Paramètres

comparer
IComparer

Implémentation de IComparer qui exécute l'opération de tri personnalisée.

Exceptions

comparer a la valeur null.

VirtualMode a la valeur true.

- ou -

DataSource n’est pas un null.

Exemples

L’exemple de code suivant montre comment utiliser la surcharge de Sort méthode dans un scénario de tri à plusieurs colonnes. Dans cet exemple, l’interface IComparer est implémentée dans la RowComparer classe .

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

Remarques

Cette méthode permet une personnalisation avancée de la fonctionnalité de tri de la DataGridView classe. Pour implémenter une opération de tri hautement personnalisée, vous pouvez écrire un gestionnaire d’événements pour l’événement ColumnHeaderMouseClick et appeler cette méthode avec un instance d’une classe qui implémente l’interface System.Collections.IComparer en tant que paramètre. Dans ce cas, vous allez généralement définir la propriété DataGridViewColumnSortMode.Programmatic sur pour désactiver le DataGridViewColumn.SortMode tri automatique et laisser de la place pour un glyphe de tri. Lorsque vous triez par colonnes définies sur le mode de tri par programmation, vous devez afficher vous-même le glyphe de tri en définissant la DataGridViewColumnHeaderCell.SortGlyphDirection propriété .

Cette méthode fonctionne uniquement lorsque la DataSource propriété n’est pas définie. Lorsque vous liez le DataGridView contrôle à une source de données externe, vous devez utiliser les opérations de tri fournies par cette source de données. Lorsque vous fournissez votre propre source de données en implémentant le mode virtuel, vous devez également gérer les opérations de tri vous-même.

L’appel de cette méthode définit automatiquement la CurrentCell propriété sur null.

Voir aussi

S’applique à

Sort(DataGridViewColumn, ListSortDirection)

Trie le contenu du contrôle DataGridView dans l’ordre croissant ou décroissant en fonction du contenu de la colonne spécifiée.

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)

Paramètres

dataGridViewColumn
DataGridViewColumn

Colonne selon laquelle trier le contenu du DataGridView.

direction
ListSortDirection

Une des valeurs de l'objet ListSortDirection.

Exceptions

La colonne spécifiée ne fait pas partie de ce DataGridView.

- ou -

La propriété DataSource a été définie et la propriété IsDataBound de la colonne spécifiée retourne false.

dataGridViewColumn a la valeur null.

La propriété VirtualMode a été définie sur true et la propriété IsDataBound de la colonne spécifiée retourne false.

- ou -

L’objet spécifié par la propriété DataSource n’implémente pas l’interface IBindingList.

- ou -

L’objet spécifié par la propriété DataSource a une propriété SupportsSorting dont la valeur est false.

Exemples

L’exemple de code suivant montre comment utiliser dans Sort un tri programmatique.

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

Remarques

Cette méthode trie le contenu du en comparant les DataGridView valeurs dans la colonne spécifiée. Par défaut, l’opération de tri utilise la Compare méthode pour comparer des paires de cellules dans la colonne à l’aide de la DataGridViewCell.Value propriété .

Pour les colonnes dont la SortMode propriété est définie DataGridViewColumnSortMode.Automaticsur , les SortedColumn propriétés et SortOrder sont définies automatiquement et le glyphe de tri approprié s’affiche. Pour les colonnes dont la SortMode propriété est définie DataGridViewColumnSortMode.Programmaticsur , vous devez afficher vous-même le glyphe de tri à l’aide de la DataGridViewColumnHeaderCell.SortGlyphDirection propriété .

Vous pouvez personnaliser l’opération de tri utilisée par cette méthode en gérant l’événement SortCompare . Cet événement se produit uniquement lorsque la DataSource propriété n’a pas été définie.

Une fois la DataSource propriété définie, cette méthode fonctionne uniquement pour les colonnes liées aux données. Les colonnes liées aux données ont leur DataGridViewColumn.DataPropertyName propriété définie. Cela entraîne le retour truede la DataGridViewColumn.IsDataBound propriété .

Si votre DataGridView contrôle contient à la fois des colonnes liées et non liées, vous devez implémenter le mode virtuel pour conserver les valeurs des colonnes non liées lorsque le contrôle est trié par une colonne liée. Pour ce faire, définissez la VirtualMode propriété true sur et gérez l’événement CellValueNeeded . Si la colonne est modifiable, vous devez également gérer l’événement CellValuePushed . Pour plus d’informations sur le mode virtuel, consultez Guide pratique pour implémenter le mode virtuel dans le contrôle DataGridView Windows Forms. Le tri par colonnes non liées lorsque le contrôle est lié aux données n’est pas pris en charge.

Voir aussi

S’applique à