DataGridView.Sort Método

Definición

Ordena el contenido del control DataGridView.Sorts the contents of the DataGridView control.

Sobrecargas

Sort(IComparer)

Ordena el contenido del control DataGridView usando una implementación de la interfaz IComparer.Sorts the contents of the DataGridView control using an implementation of the IComparer interface.

Sort(DataGridViewColumn, ListSortDirection)

Ordena el contenido del control DataGridView en orden ascendente o descendente en función del contenido de la columna especificada.Sorts the contents of the DataGridView control in ascending or descending order based on the contents of the specified column.

Sort(IComparer)

Ordena el contenido del control DataGridView usando una implementación de la interfaz IComparer.Sorts the contents of the DataGridView control using an implementation of the IComparer interface.

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.An implementation of IComparer that performs the custom sorting operation.

Excepciones

comparer es null.comparer is null.

El valor de VirtualMode está establecido en true.VirtualMode is set to true.

o bien-or- DataSource no es null.DataSource is not null.

Ejemplos

En el ejemplo de código siguiente se muestra cómo usar la sobrecarga del método Sort en un escenario de ordenación de varias columnas.The following code example demonstrates how to use the Sort method overload in a multiple column sort scenario. En este ejemplo, la interfaz IComparer se implementa en la clase RowComparer.In this example, the IComparer interface is implemented in the RowComparer class.

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 clase DataGridView.This method allows advanced customization of the sorting feature of the DataGridView class. Para implementar una operación de ordenación muy personalizada, puede escribir un controlador de eventos para el evento ColumnHeaderMouseClick y llamar a este método con una instancia de una clase que implemente la interfaz System.Collections.IComparer como parámetro.In order to implement a highly customized sorting operation, you can write an event handler for the ColumnHeaderMouseClick event and call this method with an instance of a class that implements the System.Collections.IComparer interface as a parameter. En este caso, normalmente se establecerá la propiedad DataGridViewColumn.SortMode en DataGridViewColumnSortMode.Programmatic para deshabilitar la ordenación automática y dejar espacio para un glifo de ordenación.In this case, you will typically set the DataGridViewColumn.SortMode property to DataGridViewColumnSortMode.Programmatic to disable automatic sorting and to leave room for a sorting glyph. Al ordenar por columnas establecidas en el modo de ordenación mediante programación, debe mostrar el glifo de ordenación mediante el establecimiento de la propiedad DataGridViewColumnHeaderCell.SortGlyphDirection.When sorting by columns set to programmatic sort mode, you must display the sorting glyph yourself by setting the DataGridViewColumnHeaderCell.SortGlyphDirection property.

Este método solo funciona cuando no se establece la propiedad DataSource.This method works only when the DataSource property is not set. Al enlazar el control DataGridView a un origen de datos externo, debe utilizar las operaciones de ordenación proporcionadas por ese origen de datos.When you bind the DataGridView control to an external data source, you must use the sorting operations provided by that data source. Al proporcionar su propio origen de datos mediante la implementación del modo virtual, también debe controlar las operaciones de ordenación.When you provide your own data source by implementing virtual mode, you must also handle the sorting operations yourself.

Al llamar a este método, se establece automáticamente la propiedad CurrentCell en null.Calling this method automatically sets the CurrentCell property to null.

Consulte también:

Sort(DataGridViewColumn, ListSortDirection)

Ordena el contenido del control DataGridView en orden ascendente o descendente en función del contenido de la columna especificada.Sorts the contents of the DataGridView control in ascending or descending order based on the contents of the specified column.

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

Parámetros

dataGridViewColumn
DataGridViewColumn

Columna por la que se ordena el contenido del control DataGridView.The column by which to sort the contents of the DataGridView.

direction
ListSortDirection

Uno de los valores de ListSortDirection.One of the ListSortDirection values.

Excepciones

La columna especificada no es parte de este DataGridView.The specified column is not part of this DataGridView.

O bien-or- La propiedad DataSource se ha establecido y la propiedad IsDataBound de la columna especificada devuelve false.The DataSource property has been set and the IsDataBound property of the specified column returns false.

dataGridViewColumn es null.dataGridViewColumn is null.

La propiedad VirtualMode se ha establecido en true y la propiedad IsDataBound de la columna especificada devuelve false.The VirtualMode property is set to true and the IsDataBound property of the specified column returns false.

o bien-or- El objeto especificado por la propiedad DataSource no implementa la interfaz IBindingList.The object specified by the DataSource property does not implement the IBindingList interface.

o bien-or- El objeto especificado por la propiedad DataSource tiene un valor de propiedad SupportsSorting de false.The object specified by the DataSource property has a SupportsSorting property value of false.

Ejemplos

En el ejemplo de código siguiente se muestra cómo utilizar el Sort en una ordenación mediante programación.The following code example demonstrates how to use the Sort in a programmatic sort.

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 del DataGridView comparando los valores de la columna especificada.This method sorts the contents of the DataGridView by comparing values in the specified column. De forma predeterminada, la operación de ordenación usará el método Compare para comparar pares de celdas en la columna mediante la propiedad DataGridViewCell.Value.By default, the sort operation will use the Compare method to compare pairs of cells in the column using the DataGridViewCell.Value property.

En el caso de las columnas con la propiedad SortMode establecida en DataGridViewColumnSortMode.Automatic, las propiedades SortedColumn y SortOrder se establecen automáticamente y se muestra el glifo de ordenación adecuado.For columns with the SortMode property set to DataGridViewColumnSortMode.Automatic, the SortedColumn and SortOrder properties are set automatically and the appropriate sorting glyph is displayed. En el caso de las columnas con la propiedad SortMode establecida en DataGridViewColumnSortMode.Programmatic, debe mostrar el glifo de ordenación por medio de la propiedad DataGridViewColumnHeaderCell.SortGlyphDirection.For columns with the SortMode property set to DataGridViewColumnSortMode.Programmatic, you must display the sorting glyph yourself through the DataGridViewColumnHeaderCell.SortGlyphDirection property.

Puede personalizar la operación de ordenación utilizada por este método mediante el control del evento SortCompare.You can customize the sorting operation used by this method by handling the SortCompare event. Este evento solo se produce cuando no se ha establecido la propiedad DataSource.This event occurs only when the DataSource property has not been set.

Cuando se ha establecido la propiedad DataSource, este método solo funciona para las columnas enlazadas a datos.When the DataSource property has been set, this method works for data-bound columns only. Las columnas enlazadas a datos tienen establecida la propiedad DataGridViewColumn.DataPropertyName.Data-bound columns have had their DataGridViewColumn.DataPropertyName property set. Esto hace que la propiedad DataGridViewColumn.IsDataBound devuelva true.This causes the DataGridViewColumn.IsDataBound property to return true.

Si el control DataGridView contiene columnas enlazadas y sin enlazar, debe implementar el modo virtual para mantener los valores de las columnas sin enlazar cuando el control se ordene por una columna enlazada.If your DataGridView control contains both bound and unbound columns, you must implement virtual mode to maintain the values of the unbound columns when the control is sorted by a bound column. Para ello, establezca la propiedad VirtualMode en true y controle el evento CellValueNeeded.You can do this by setting the VirtualMode property to true and handling the CellValueNeeded event. Si la columna es editable, también debe controlar el evento CellValuePushed.If the column is editable, you should also handle the CellValuePushed event. Para obtener más información sobre el modo virtual, vea [How para: Implemente el modo virtual en el control DataGridView Windows Forms @ no__t-0.For more information about virtual mode, see How to: Implement Virtual Mode in the Windows Forms DataGridView Control. No se admite la ordenación por columnas sin enlazar cuando el control está enlazado a datos.Sorting by unbound columns when the control is data-bound is not supported.

Consulte también:

Se aplica a