winform ejemplos databind c# winforms sorting datagridview edit

ejemplos - fill datagridview c#



Evite que DataGridView enlazado a datos clasifique al editar (4)

Para el beneficio de otros, aquí está la solución que se me ocurrió, pero me encantaría escuchar una mejor.

Agregué una columna adicional, no persistente a DataTable llamada SORT_ORDER que se usa solo para la clasificación.

Cuando el usuario hace clic en una columna para ordenar, copio los valores y el tipo de valor de la columna seleccionada a la columna SORT_ORDER y luego selecciono SORT_ORDER. Como SORT_ORDER no está visible y no se puede editar, el orden de clasificación no cambia aunque el usuario edite la columna seleccionada. El controlador de eventos se ve así:

private void MyDataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) { dirtyCellListenerEnabled = false; SORT_ORDER.ValueType = MyDataGridView.Columns[e.ColumnIndex].ValueType; foreach(DataGridViewRow r in MyDataGridView.Rows) { r.Cells[SORT_ORDER.Index].Value = r.Cells[e.ColumnIndex].Value; } switch(MyDataGridView.SortOrder) { case System.Windows.Forms.SortOrder.None: MyDataGridView.Sort(SORT_ORDER, ListSortDirection.Ascending); break; case System.Windows.Forms.SortOrder.Ascending: MyDataGridView.Sort(SORT_ORDER, ListSortDirection.Descending); break; case System.Windows.Forms.SortOrder.Descending: MyDataGridView.Sort(SORT_ORDER, ListSortDirection.Ascending); break; } dirtyCellListenerEnabled = true; }

Tenga en cuenta que tuve que deshabilitar y volver a habilitar mi escucha de celular para que mi código no trate la actualización de columna de clasificación como un cambio real.

Antes de llegar a esta solución, también intenté agregar la columna de clasificación a DataGridView, pero no funciona porque DataGridView no puede ordenar una columna que no existe en su fuente de datos.

Estoy seguro de que hay otros ajustes que también podría hacer, como suspender actualizaciones mientras llenas SORT_ORDER y mostrar el glifo de ordenación en la columna seleccionada.

Tengo un DataGridView de datos en una aplicación Win Forms que el usuario puede haber ordenado por una columna. El problema es este: después de que el usuario deja una fila después de editar una celda en la columna ordenada, la fila se vuelve a ordenar inmediatamente.

Esto es muy desorientador para los usuarios y hace que la edición de grupos de filas sea imposible.

La solución que estoy buscando deshabilitará automáticamente la reorganización automática después de una clasificación inicial y luego solo volverá a ordenar cuando el usuario lo solicite.


Parece que su GridView es un enlace de datos de nuevo. Esto significa que su orden de clasificación se perderá. Habilite Viewstate de su gridview y asegúrese de que no está vinculando la grilla en la devolución de datos.


Esto es un verdadero dolor como me estoy dando cuenta en este momento. Las rejillas son brutalmente complicadas a veces por aparentemente nada

para cada celda seleccionada, almaceno la clave primaria, y el nombre de la columna de la grilla (hice una pequeña clase para mantener esos).

Luego los incluyo en una lista y los repito para actualizarlos. Cada vez que actualizo un valor de celda, busco dónde está ahora la celda real y reemplazo mi variable de referencia local a esa celda para poder continuar con el código.

Cell.Value = ValueToWrite Cell = FindCell(Cell.OwningRow.DataGridView, DataRow, ColName) Function FindCell(Grid As DataGridView, DataRow As DataRow, ColName As String) As DataGridViewCell ''Find the same cell, wherever you may be now, damn you sort. Dim GridRow = (From x As DataGridViewRow In Grid.Rows Where x.DataBoundItem.row Is DataRow).FirstOrDefault Dim Cell = GridRow.Cells(ColName) Return Cell End Function


Me he encontrado con este problema y no pude obtener una respuesta decente, así que lo intenté y funcionó,

private void SortBoundDG() { DataTable TempTable; TempTable = (DataTable)DG.DataSource; TempTable.DefaultView.Sort = ColumnName + " " + "DESC"; DG.DataSource = TempTable.DefaultView.ToTable(); }

simplemente convierta la vista predeterminada a una tabla y configúrela como fuente para su vista de cuadrícula de datos