Compartir a través de


Modos de ordenación de columnas en el control DataGridView de los formularios de 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 SortMode propiedad de la columna, que se puede establecer en uno de los siguientes DataGridViewColumnSortMode valores de enumeración.

DataGridViewColumnSortMode valor 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 que no son de cuadro de texto. Puede ordenar esta columna mediante programación; sin embargo, no está pensado para la ordenación, por lo que no hay espacio reservado para el glifo de ordenación.
Programmatic Puede ordenar esta columna mediante programación y el espacio está reservado para el glifo de ordenación.

Es posible que desee cambiar el modo de ordenación de una columna a la que el valor predeterminado es NotSortable si 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 de celda numéricos en valores de visualización de imágenes en un controlador del evento DataGridView.CellFormatting. En este caso, establecer la SortMode propiedad en Automatic permitirá a los usuarios ordenar la columna. La ordenación automática permitirá a los usuarios agrupar 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 programáticamente por los valores de cualquier columna o en varias, independientemente de las SortMode configuraciones. La ordenación mediante programación es útil cuando desea proporcionar su propia interfaz de usuario (UI) para ordenar o cuando desea implementar la ordenación personalizada. Proporcionar su propia interfaz de usuario de ordenación es útil, por ejemplo, cuando estableces el modo de selección para habilitar la DataGridView selección de encabezados de columna. En este caso, aunque no se pueden usar los encabezados de columna para la ordenación, 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, debes mostrar el glifo por ti mismo configurando la propiedad DataGridViewColumnHeaderCell.SortGlyphDirection. Esto es necesario si desea flexibilidad en la ordenación personalizada. Por ejemplo, si ordena el DataGridView según varias columnas, es posible que desee mostrar varios glifos de ordenación o ningún glifo de ordenación.

Aunque puede ordenar mediante programación una DataGridView por cualquier columna, es posible que algunas columnas, como columnas de botón, no contengan valores que se puedan ordenar significativamente. Para estas columnas, una SortMode configuración de propiedad de NotSortable indica que no se usará nunca para ordenar, por lo tanto, 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, consulte la sección Ordenación personalizada más adelante en este tema.

Cuando se ordena un DataGridView control que contiene columnas enlazadas y sin enlazar, los valores de las columnas sin enlazar no se pueden mantener automáticamente. Para mantener estos valores, debe implementar el modo virtual estableciendo la propiedad VirtualMode a true y gestionando los eventos CellValueNeeded y CellValuePushed. Para obtener más información, vea Cómo: Implementar el modo virtual en el control DataGridView de formularios Windows Forms. La clasificación por columnas no vinculadas en modo vinculado no está soportada.

Ordenación mediante programación

Puede ordenar un objeto DataGridView de forma programática llamando a su método Sort.

La Sort(DataGridViewColumn,ListSortDirection) sobrecarga del método Sort toma un DataGridViewColumn y un ListSortDirection como parámetro. 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 llamas a esta sobrecarga y pasas una columna con una propiedad SortMode con un valor de DataGridViewColumnSortMode.Automatic, las propiedades SortedColumn y SortOrder se establecen automáticamente y el glifo de ordenación apropiado aparece en el encabezado de columna.

Nota:

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

Ordenación personalizada

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

La sobrecarga del método Sort(IComparer) toma como parámetro una instancia de una clase que implementa la interfaz IComparer. 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 ordenan haciendo clic en los encabezados de columna. Puede invocar esta sobrecarga en un manejador para el evento ColumnHeaderMouseClick si no usa encabezados de columna para la selección.

Nota:

La Sort(IComparer) sobrecarga del método solo funciona cuando el DataGridView control no está enlazado a un origen de datos externo y el valor de la VirtualMode propiedad 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 modo virtual, debe proporcionar sus propias operaciones de clasificación para columnas no vinculadas.

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

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

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

Nota:

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

Consulte también