2009-09-09 10 views
8

¿Cuál es el método adecuado para contar una DataGridView para detener la clasificación?.NET WinForms/- Borrar un Clasificar en un DataGridView

que tienen una "pantalla", donde le digo a la red mediante programación para ordenar por la columna 4 y ascendente. Cuando cambio a otra área, quiero que la misma grilla entre en "default"/no sort. Estoy eliminando todas las columnas y agregando nuevas. El género permanece en la cuarta columna.

no veo una manera de hacer esto con el método sort(). ¿Algunas ideas?

+0

¿Esta es una cuadrícula de datos encuadernados? –

+0

Sí. Pero incluso estoy cambiando DataSources. Estoy llamando DataSource = null y Columns.Clear antes del cambio. – BuddyJoe

+0

Me gustaría poder permitir una actualización pero guardar el orden de clasificación. Pero si el usuario cambia lo que quiere mirar (a través de un TreeView), entonces me gustaría que el orden de clasificación desaparezca. ¿Es esto un error? He intentado algunas cosas, no puedo encontrar una manera de hacer que desaparezca. – BuddyJoe

Respuesta

1

No es una respuesta directa, pero hay por supuesto ninguna buena definición para 'sin clasificar'. ¿No puedes ordenar en una columna (oculta), como una identificación?

+0

buena idea. Tengo una columna falsa que agrego a la DataTable después de que DataAdapter la carga, llamada "row_number", para la que se usa es paginación (si elijo activarla). +1. Esta podría ser mi respuesta. – BuddyJoe

+1

Existen restricciones en la clasificación de columnas 'falsas' en combinación con un DataSource, vea MSDN. –

6

De MSN Forums:

El DataGridView está vinculado a un DataView y no a la tabla directamente, por lo que es necesario establecer:

DataTable.DefaultView.Sort = String.Empty

limpiar con eficacia la clasificación en la tabla y por lo tanto la cuadrícula eso está ligado a eso. Esto parece requerir un Refresh de DataGridView, a menos que esté usando 2005, y luego puede usar un administrador de enlace por separado.

6

que ha accedido a la clase en la BindingSource directamente:

((BindingSource)_dgv.DataSource).Sort = string.Empty;

+0

Esto no funciona si el DataSource es un DataTable –

+0

¡Gracias! Acabo de usar BindingSource.Sort = "" y funcionó bien. – CrazyPaste

-1
/// C# 
/// Author : Jeudi Prando 

foreach (DataGridViewColumn column in this.DataGridView1.Columns) 
{ 
    column.SortMode = DataGridViewColumnSortMode.NotSortable; 
    column.SortMode = DataGridViewColumnSortMode.Automatic; 
} 
0

intente configurar ItemSource de la cuadrícula para nada, luego otra vez de nuevo a DefaultView

1

de la tabla en el mismo dominio que la respuesta de user2268720 .. no es la solución más limpia, pero no el trabajo para mí con un DGV no unido:

  if (dgv.SortedColumn != null) { 
       DataGridViewColumn col = dgv.SortedColumn; 
       col.SortMode = DataGridViewColumnSortMode.NotSortable; 
       col.SortMode = DataGridViewColumnSortMode.Automatic; 
      } 
0

Tuve este problema hoy también. Tengo un DataGridView que intercambie a cabo su DataSource (un DataTable) con regularidad. Yo era capaz de eliminar finalmente el tipo especificado por el usuario cuando el usuario hace clic en un encabezado de columna usando el siguiente código:

If dgv.SortedColumn IsNot Nothing AndAlso dgv.DataSource IsNot Nothing Then 
     Dim dt_Sender As DataTable = DirectCast(dgv.DataSource, DataTable) 
     dt_Sender.DefaultView.Sort = dt_Sender.Columns(0).ColumnName & " ASC" 
    End If 

Esto funciona porque tengo una columna oculta en mi DataGridView que siempre está en la posición de índice-columna 0. Es una clave primaria entera para los datos subyacentes que se clasifica en la carga de datos.

* Es posible que deba nombrar su columna de índice en el DataTable si aún no lo ha hecho (por ejemplo, dt_Sender.Columns(0).ColumnName = "colIndex").

* Si se utiliza un objeto BindingSource como intermediario entre su DataGridView y su DataTable (como muchas personas parecen hacerlo), entonces tendrá que anidan su DirectCast adecuadamente en la segunda línea (es decir, Dim dt_Sender As DataTable = DirectCast(dgv.DataSource, DataTable) cambiaría a algo como: Dim dt_Sender As DataTable = DirectCast(DirectCast(dgv.DataSource, BindingSource), DataTable)).

* Además, si su DataTable pasa a estar poblado por una consulta de SQL Server que no tiene una clave primaria entera (¿quizás un GUID?), Entonces podría alterar su consulta fuente para incluir un nuevo número de fila y luego ocultar la nueva columna en su DataGridView. P.ej.:

SELECT Row_Number() OVER (ORDER BY (SELECT '')) AS RowNumber, Column1, Column2, Column3 
FROM SourceTable 

Esperemos que esta solución sea útil para otra persona en el futuro.

Cuestiones relacionadas