Compartir a través de


DataGridView.Sort Método

Definición

Ordena el contenido del control DataGridView.

Sobrecargas

Sort(IComparer)

Ordena el contenido del control DataGridView usando una implementación de la interfaz IComparer.

Sort(DataGridViewColumn, ListSortDirection)

Ordena el contenido del control DataGridView en orden ascendente o descendente en función del contenido de la columna especificada.

Sort(IComparer)

Ordena el contenido del control DataGridView usando una implementación de la interfaz 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)

Parámetros

comparer
IComparer

Implementación de IComparer que realiza la operación de ordenación personalizada.

Excepciones

comparer es null.

El valor de VirtualMode está establecido en true.

o bien

DataSource no es null.

Ejemplos

En el ejemplo de código siguiente se muestra cómo usar la sobrecarga del Sort método en un escenario de ordenación de varias columnas. En este ejemplo, la IComparer interfaz se implementa en la RowComparer clase .

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

Comentarios

Este método permite la personalización avanzada de la característica de ordenación de la DataGridView clase . Para implementar una operación de ordenación altamente personalizada, puede escribir un controlador de eventos para el ColumnHeaderMouseClick evento y llamar a este método con una instancia de una clase que implemente la System.Collections.IComparer interfaz como parámetro. En este caso, normalmente establecerá la propiedad DataGridViewColumnSortMode.Programmatic en para deshabilitar la DataGridViewColumn.SortMode ordenación automática y dejar espacio para un glifo de ordenación. Al ordenar por columnas establecidas en modo de ordenación mediante programación, debe mostrar el glifo de ordenación usted mismo estableciendo la DataGridViewColumnHeaderCell.SortGlyphDirection propiedad .

Este método solo funciona cuando no se establece la DataSource propiedad . Al enlazar el DataGridView control a un origen de datos externo, debe usar las operaciones de ordenación proporcionadas por ese origen de datos. Al proporcionar su propio origen de datos mediante la implementación del modo virtual, también debe controlar las operaciones de ordenación usted mismo.

Al llamar a este método, se establece automáticamente la CurrentCell propiedad nullen .

Consulte también

Se aplica a

Sort(DataGridViewColumn, ListSortDirection)

Ordena el contenido del control DataGridView en orden ascendente o descendente en función del contenido de la columna especificada.

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)

Parámetros

dataGridViewColumn
DataGridViewColumn

Columna por la que se ordena el contenido del control DataGridView.

direction
ListSortDirection

Uno de los valores de ListSortDirection.

Excepciones

La columna especificada no es parte de este DataGridView.

o bien

La propiedad DataSource se ha establecido y la propiedad IsDataBound de la columna especificada devuelve false.

dataGridViewColumn es null.

La propiedad VirtualMode se ha establecido en true y la propiedad IsDataBound de la columna especificada devuelve false.

o bien

El objeto especificado por la propiedad DataSource no implementa la interfaz IBindingList.

o bien

El objeto especificado por la propiedad DataSource tiene un valor de propiedad SupportsSorting de false.

Ejemplos

En el ejemplo de código siguiente se muestra cómo usar en Sort una ordenación mediante programación.

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

Comentarios

Este método ordena el contenido de comparando DataGridView los valores de la columna especificada. De forma predeterminada, la operación de ordenación usará el Compare método para comparar pares de celdas de la columna mediante la DataGridViewCell.Value propiedad .

Para las columnas con la SortMode propiedad establecida DataGridViewColumnSortMode.Automaticen , las SortedColumn propiedades y SortOrder se establecen automáticamente y se muestra el glifo de ordenación adecuado. Para las columnas con la SortMode propiedad establecida en DataGridViewColumnSortMode.Programmatic, debe mostrar el glifo de ordenación a través de la DataGridViewColumnHeaderCell.SortGlyphDirection propiedad .

Puede personalizar la operación de ordenación usada por este método controlando el SortCompare evento. Este evento solo se produce cuando no se ha establecido la DataSource propiedad .

Cuando se ha establecido la DataSource propiedad , este método solo funciona para las columnas enlazadas a datos. Las columnas enlazadas a datos han tenido su DataGridViewColumn.DataPropertyName conjunto de propiedades. Esto hace que la DataGridViewColumn.IsDataBound propiedad devuelva true.

Si el DataGridView control contiene columnas enlazadas y no enlazadas, debe implementar el modo virtual para mantener los valores de las columnas sin enlazar cuando el control está ordenado por una columna enlazada. Para ello, establezca la VirtualMode propiedad true en y controle el CellValueNeeded evento. Si la columna es editable, también debe controlar el CellValuePushed evento. Para obtener más información sobre el modo virtual, vea How to: Implement Virtual Mode in the Windows Forms DataGridView Control. No se admite la ordenación por columnas sin enlazar cuando el control es enlazado a datos.

Consulte también

Se aplica a