Modos de ordenación de columnas del control DataGridView de formularios Windows Forms

DataGridView las columnas tienen tres modos de ordenación. El modo de ordenación de cada columna se especifica a través de la propiedad SortMode de la columna, que se puede establecer en uno de los siguientes valores de enumeración DataGridViewColumnSortMode.

Valor de DataGridViewColumnSortMode Descripción
Automatic Valor predeterminado para las columnas del cuadro de texto. A menos que se usen encabezados de columna para la selección, al hacer clic en el encabezado de columna, se ordena DataGridView automáticamente por esta columna y se muestra un glifo que indica el criterio de ordenación.
NotSortable Valor predeterminado para las columnas no de cuadro de texto. Esta columna se puede ordenar mediante programación; sin embargo, no está pensada para la ordenación, por lo que no se reserva espacio para el glifo de ordenación.
Programmatic Puede ordenar esta columna mediante programación, y hay espacio reservado para el glifo de ordenación.

Es posible que desee cambiar el modo de ordenación NotSortable predeterminado de una columna si la columna contiene valores que se pueden ordenar significativamente. Por ejemplo, si tiene una columna de base de datos que contiene números que representan estados de elemento, puede mostrar estos números como iconos correspondientes enlazando una columna de imagen a la columna de base de datos. A continuación, puede cambiar los valores numéricos de las celdas en valores de visualización de imagen en un controlador para el evento DataGridView.CellFormatting. En este caso, establecer la propiedad SortMode en Automatic permitirá a los usuarios ordenar la columna. La ordenación automática permitirá que los usuarios agrupen elementos que tengan el mismo estado, incluso si los estados correspondientes a los números no tienen una secuencia natural. Las columnas de casilla son otro ejemplo en el que la ordenación automática es útil para agrupar elementos en el mismo estado.

Puede ordenar un DataGridView mediante programación según los valores de cualquier columna o de varias columnas, independientemente de la configuración SortMode. La ordenación mediante programación es útil cuando desea proporcionar su propia interfaz de usuario (UI) para ordenar o cuando desea implementar una ordenación personalizada. Proporcionar su propia interfaz de usuario de ordenación es útil, por ejemplo, al establecer el modo de selección DataGridView para habilitar la selección de encabezados de columna. En este caso, aunque los encabezados de columna no se pueden usar para la ordenación, todavía desea que los encabezados muestren el glifo de ordenación adecuado, por lo que establecería la propiedad SortMode en Programmatic.

Las columnas establecidas en modo de ordenación mediante programación no muestran automáticamente un glifo de ordenación. Para estas columnas, debe mostrar el glifo usted mismo estableciendo la propiedad DataGridViewColumnHeaderCell.SortGlyphDirection. Esto es necesario si desea que la ordenación personalizada tenga flexibilidad. Por ejemplo, si ordena DataGridView por varias columnas, es posible que desee mostrar varios glifos de ordenación, o ninguno.

Aunque puede ordenar una DataGridView por cualquier columna mediante programación, es posible que algunas columnas, como columnas de botón, no contengan valores que se puedan ordenar significativamente. Para estas columnas, un valor NotSortable en la propiedad SortMode indica que nunca se usarán para la ordenación, por lo que no es necesario reservar espacio en el encabezado para el glifo de ordenación.

Cuando se ordena un DataGridView, puede determinar, tanto la columna de ordenación, como el criterio de ordenación comprobando los valores de las propiedades SortedColumn y SortOrder. Estos valores no son significativos después de una operación de ordenación personalizada. Para obtener más información sobre la ordenación personalizada, vea la sección Ordenación personalizada más adelante en este tema.

Cuando se ordena un control DataGridView que contiene columnas enlazadas y no enlazadas, los valores de las columnas no enlazadas no se pueden mantener automáticamente. Para mantener estos valores, debe implementar el modo virtual estableciendo la propiedad VirtualMode en true y controlando los eventos CellValueNeeded y CellValuePushed. Para obtener más información, consulte Cómo: Implementar el modo virtual en el control DataGridView de Windows Forms. En modo enlazado no se admite la ordenación por columnas sin enlazar.

Ordenación mediante programación

Puede ordenar un DataGridView mediante programación llamando a su método Sort.

La sobrecarga Sort(DataGridViewColumn,ListSortDirection) del método Sort toma un DataGridViewColumn y un valor de enumeración ListSortDirection como parámetros. Esta sobrecarga es útil al ordenar por columnas con valores que se pueden ordenar significativamente, pero que no desea configurar para la ordenación automática. Cuando se llama a esta sobrecarga y se pasa una columna con un valor de propiedad SortMode de DataGridViewColumnSortMode.Automatic, las propiedades SortedColumn y SortOrder se establecen automáticamente y el glifo de ordenación adecuado aparece en el encabezado de columna.

Nota:

Cuando el control DataGridView se enlaza a un origen de datos externo al establecer la propiedad DataSource, la sobrecarga del método Sort(DataGridViewColumn,ListSortDirection) no funciona para las columnas no enlazadas. Además, cuando la propiedad VirtualMode es true, puede llamar a esta sobrecarga solo para las columnas enlazadas. Para determinar si una columna está enlazada a datos, compruebe el valor de la propiedad IsDataBound. En modo enlazado no se admite la ordenación por columnas sin enlazar.

Ordenación personalizada

Puede personalizar DataGridView mediante la sobrecarga Sort(IComparer) del método Sort o controlando el evento SortCompare.

La sobrecarga Sort(IComparer) del método toma una instancia de una clase que implementa la interfaz IComparer como parámetro. Esta sobrecarga es útil cuando se desea proporcionar una ordenación personalizada; por ejemplo, cuando los valores de una columna no tienen un criterio de ordenación natural o cuando el criterio de ordenación natural es inadecuado. En este caso, no puede usar la ordenación automática, pero es posible que quiera que los usuarios ordenen haciendo clic en los encabezados de columna. Puede llamar a esta sobrecarga en un controlador para el evento ColumnHeaderMouseClick si no usa encabezados de columna para la selección.

Nota:

La sobrecarga Sort(IComparer) del método solo funciona cuando el control DataGridView no está enlazado a un origen de datos externo y el valor de la propiedad VirtualMode es false. Para personalizar la ordenación de las columnas enlazadas a un origen de datos externo, debe usar las operaciones de ordenación proporcionadas por el origen de datos. En el modo virtual debe proporcionar sus propias operaciones de ordenación para las columnas sin enlazar.

Para usar la sobrecarga Sort(IComparer) del método, debe crear su propia clase que implemente la interfaz IComparer. Esta interfaz requiere que la clase implemente el método IComparer.Compare, al que el DataGridView pasa objetos DataGridViewRow como entrada cuando se llama a la sobrecarga Sort(IComparer) del método. De este modo puede calcular el orden correcto de filas en función de los valores de cualquier columna.

La sobrecarga Sort(IComparer) del método no establece las propiedades SortedColumn y SortOrder, por lo que siempre debe establecer la propiedad DataGridViewColumnHeaderCell.SortGlyphDirection para mostrar el glifo de ordenación.

Como alternativa a la sobrecarga del método Sort(IComparer), puede proporcionar una ordenación personalizada implementando un controlador para el evento SortCompare. Este evento se produce cuando los usuarios hacen clic en los encabezados de las columnas configuradas para la ordenación automática o cuando se llama a la sobrecarga Sort(DataGridViewColumn,ListSortDirection) del método Sort. El evento se produce para cada par de filas del control, lo que le permite calcular su orden correcto.

Nota:

El evento SortCompare no se produce cuando se establece la propiedad DataSource ni cuando el valor de la propiedad VirtualMode es true.

Consulte también