Quería ordenar un datagridview cuando pinchase sobre el encabezado del grid, para ello se debe usar el evento:
private void grid_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
En el siguiente link puedes ver como hacerlo OrdenarGrid
Esto en mi caso no me sirvió, ya que cargaba el DataGridView a partir de una lista.
Obtenía el siguiente error:
La solución por la que opte, fue ordenar la lista y asignarla al DataSource.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
// Creo dos variables para tener el lista y el orden aplicado. private string _ordenGrid=string.Empty; private IEnumerable<claseModelo> _listado; private void gridComercialAgencia_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) { //Obtengo la columna que ha pinchado su encabezado. var columna = grid.Columns[e.ColumnIndex]; // Defino la dirección para ordenar por defecto como ascendente ListSortDirection direccion = ListSortDirection.Ascending; // Reviso si a pinchado sobre el mismo encabezado que la última vez que ordeno, ya que entonces quiere ordenarlo en diferente dirección if (_ordenGrid.Contains(columna.Name)) { direccion = (_ordenGrid.Contains("desc")) ? ListSortDirection.Ascending : ListSortDirection.Descending; } //Guardo en la variable como voy a ordenar _ordenGrid = (direccion == ListSortDirection.Ascending) ? columna.Name + " asc" : columna.Name + " desc"; // Para no tener que usar un switch () case para cada columna, utilizo la reflection** var propiedad = typeof(claseModelo).GetProperty(columna.Name); _listado = (direccion == ListSortDirection.Ascending) ? _listado.OrderBy(l => propiedad.GetValue(l, null)) : _listado.OrderByDescending(l => propiedad.GetValue(l, null)); //Asigno de nuevo el listado gridComercialAgencia.DataSource = _listado.ToList().Cast<claseModelo>(); // Muestro en la columna en concreto la dirección en la que se ha ordenado. grid.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = direccion == ListSortDirection.Ascending ? SortOrder.Ascending : SortOrder.Descending; } |
**La idea de ordenar mediante reflection la obtuve de aqui
Puede que no veas los iconitos de ordenación en los encabezados, es debido a la anchura de la columna.
En la parte de diseño puedes asignar AutoSizeColumnsMode a ColumnHeader.
También puede que te de error “SortGlyphDirection del encabezado de columna no se puede establecer en Descending mientras SortMode de la columna se establezca en NotSortable.” es debido al tipo de campo que no es texto. Para solucionarlo tienes que definirlos
1 |
grid.Columns["columcheck"].SortMode = DataGridViewColumnSortMode.Programmatic; |