DataGridView.Sort Metodo

Definizione

Ordina il contenuto del controllo DataGridView.

Overload

Sort(IComparer)

Ordina il contenuto del controllo DataGridView usando un'implementazione dell'interfaccia IComparer.

Sort(DataGridViewColumn, ListSortDirection)

Ordina il contenuto del controllo DataGridView in modo crescente o decrescente in base al contenuto della colonna specificata.

Sort(IComparer)

Ordina il contenuto del controllo DataGridView usando un'implementazione dell'interfaccia 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)

Parametri

comparer
IComparer

Implementazione di IComparer che esegue l'operazione di ordinamento personalizzata.

Eccezioni

comparer è null.

VirtualMode è impostato su true.

-oppure-

DataSource non è null.

Esempio

Nell'esempio di codice seguente viene illustrato come usare l'overload del Sort metodo in uno scenario di ordinamento a più colonne. In questo esempio l'interfaccia IComparerRowComparer viene implementata nella 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

Commenti

Questo metodo consente la personalizzazione avanzata della funzionalità di ordinamento della DataGridView classe. Per implementare un'operazione di ordinamento altamente personalizzata, è possibile scrivere un gestore eventi per l'evento e chiamare questo metodo con un'istanza di una classe che implementa l'interfaccia ColumnHeaderMouseClickSystem.Collections.IComparer come parametro. In questo caso, in genere si imposta la proprietà su DataGridViewColumnSortMode.Programmatic per disabilitare l'ordinamento DataGridViewColumn.SortMode automatico e per lasciare spazio per un glifo di ordinamento. Quando si ordinano per colonne impostate su modalità di ordinamento a livello di codice, è necessario visualizzare il glifo di ordinamento autonomamente impostando la DataGridViewColumnHeaderCell.SortGlyphDirection proprietà.

Questo metodo funziona solo quando la DataSource proprietà non è impostata. Quando si associa il controllo a un'origine dati esterna, è necessario usare le operazioni di ordinamento fornite dall'origine DataGridView dati. Quando si specifica un'origine dati personalizzata implementando la modalità virtuale, è necessario gestire anche le operazioni di ordinamento.

La chiamata a questo metodo imposta automaticamente la CurrentCell proprietà su null.

Vedi anche

Si applica a

Sort(DataGridViewColumn, ListSortDirection)

Ordina il contenuto del controllo DataGridView in modo crescente o decrescente in base al contenuto della colonna specificata.

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)

Parametri

dataGridViewColumn
DataGridViewColumn

Colonna in base alla quale deve essere ordinato il contenuto di DataGridView.

direction
ListSortDirection

Uno dei valori di ListSortDirection.

Eccezioni

La colonna specificata non fa parte dell'oggetto DataGridView.

-oppure-

The DataSource property has been set and the IsDataBound property of the specified column returns false.

dataGridViewColumn è null.

La proprietà VirtualMode è stata impostata su true e la proprietà IsDataBound della colonna specificata restituisce false.

-oppure-

L'oggetto specificato dalla proprietà DataSource non implementa l'interfaccia IBindingList.

-oppure-

L'oggetto specificato dalla proprietà DataSource include un valore false per la proprietà SupportsSorting.

Esempio

Nell'esempio di codice seguente viene illustrato come usare l'oggetto Sort in un ordinamento programmatico.

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

Commenti

Questo metodo ordina il contenuto dell'oggetto DataGridView confrontando i valori nella colonna specificata. Per impostazione predefinita, l'operazione di ordinamento userà il Compare metodo per confrontare coppie di celle nella colonna usando la DataGridViewCell.Value proprietà .

Per le colonne con la SortMode proprietà impostata su DataGridViewColumnSortMode.Automatic, le SortedColumn proprietà e SortOrder vengono impostate automaticamente e viene visualizzato il glifo di ordinamento appropriato. Per le colonne con la SortMode proprietà impostata su DataGridViewColumnSortMode.Programmatic, è necessario visualizzare il glifo di ordinamento tramite la DataGridViewColumnHeaderCell.SortGlyphDirection proprietà .

È possibile personalizzare l'operazione di ordinamento utilizzata da questo metodo gestendo l'evento SortCompare . Questo evento si verifica solo quando la DataSource proprietà non è stata impostata.

Quando la DataSource proprietà è stata impostata, questo metodo funziona solo per le colonne associate ai dati. Le colonne associate ai dati hanno avuto il relativo DataGridViewColumn.DataPropertyName set di proprietà. In questo modo la DataGridViewColumn.IsDataBound proprietà restituisce true.

Se il DataGridView controllo contiene colonne associate e non in uscita, è necessario implementare la modalità virtuale per mantenere i valori delle colonne non in uscita quando il controllo viene ordinato da una colonna associata. È possibile eseguire questa operazione impostando la proprietà su true e gestendo l'evento.VirtualModeCellValueNeeded Se la colonna è modificabile, è necessario gestire anche l'evento CellValuePushed . Per altre informazioni sulla modalità virtuale, vedere Procedura: Implementare la modalità virtuale nel controllo DataGridView Windows Forms. L'ordinamento in base alle colonne non in uscita quando il controllo è associato ai dati non è supportato.

Vedi anche

Si applica a