2010-12-16 23 views
18

Tengo un DataGridView que está vinculado a un BindingSource.Cómo ordenar DataGridView cuando está vinculado a un origen de enlace que está vinculado a una entidad EF4

Mi BindingSource está vinculado a una lista de entidades IQueryable:

public void BindTo(IQueryable elements) 
    { 
     BindingSource source = new BindingSource(); 
     source.DataSource = elements; 

     bindingNavigator1.BindingSource = source; 
     dataGridView1.DataSource = source; 

    } 

estoy queriendo mis usuarios puedan hacer clic en los encabezados de la cuadrícula para ordenar los datos - luchando para conseguir que esto funcione. ¿Es posible? Si es así, ¿cómo lo hago?

+0

Nota: DataGridView parece ser WindowsForms, no WPF. Solo para las personas que también esperaban encontrar una solución para su problema de clasificación WPF DataGrid. – OneWorld

Respuesta

11

Recientemente tuve problemas con este mismo problema; parece que la interfaz IQueryable no proporciona suficiente información para que DataViewGrid sepa cómo ordenar los datos automáticamente; así que hay que volver a empaquetar ya sea su colección de la fuente de Entidad uso de algo que puede utilizar o hacer lo que hice y manejar la funcionalidad de orden manualmente:

 private void myDataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) 
    { 
    DataGridViewColumn column = myDataGridView.Columns[e.ColumnIndex]; 

    _isSortAscending = (_sortColumn == null || _isSortAscending == false); 

    string direction = _isSortAscending ? "ASC" : "DESC"; 

    myBindingSource.DataSource = _context.MyEntities.OrderBy(
     string.Format("it.{0} {1}", column.DataPropertyName, direction)).ToList(); 

    if (_sortColumn != null) _sortColumn.HeaderCell.SortGlyphDirection = SortOrder.None; 
    column.HeaderCell.SortGlyphDirection = _isSortAscending ? SortOrder.Ascending : SortOrder.Descending; 
    _sortColumn = column; 
    } 

Espero que ayude.

+0

¿Hay alguna manera de hacer esto mientras se permiten las actualizaciones? Si usa ToList(), solo podrá escribir en la lista temporal, y si no usa ToList, DataGridView parece deshabilitar la adición de registros si está vinculado a un IOrderedEnumerable ... –

+1

Me di cuenta de que necesitaba para llamar a ObjectQuery.OrderBy y no a IEnumerable.OrderBy para mantener el enlace actualizable. –

0

VB.NET

Si está utilizando un BindingSource con la sintaxis de LINQ puede ordenar los datos de este tipo

En este caso Al cargar un bindningsource asociado a un DataGridView de framwork objetos de entidad "NCFile "con tener una columna externa a una lista de "NCFilePartSet"

bsFileSections.DataSource = From ncfps In NCFile.NCFilePartSet Order By ncfps.Sort Select ncfps 

o como esto

bsFileSections.DataSource = NCFile.NCFilePartSet.OrderBy(Function(ncfps) ncfps.Sort) 

donde "Ordenar" es una columna en NCFilePartSet

actualizaciones sobre las entidades siguen trabajando y refleja de nuevo a la base de datos

+2

El OP quiere "[dejar] que mis usuarios ... hagan clic en los encabezados de la grilla para ordenar los datos". Su respuesta funciona si codifica la columna de clasificación, pero ¿cómo maneja la vinculación de datos cuando el usuario desea cambiar la columna de ordenación y no perder ningún dato que ya haya editado/agregado? Creo que ese es el verdadero desafío aquí. – Pat

0

Sí, es posible tener fácilmente un DGV puede ordenar cuando se une a EF datos. Use BindingListView del BLW library (también, consulte How do I implement automatic sorting of DataGridView?).

public void BindTo(IQueryable elements) 
{ 
    BindingSource source = new BindingSource(); 
    source.DataSource = new BindingListView(elements.ToList()); 

    bindingNavigator1.BindingSource = source; 
    dataGridView1.DataSource = source; 

} 

En mis pruebas, incluso cuando se llamaba .ToList() dentro del constructor (como antes), los cambios fueron propagados a la base de datos, lo cual me sorprendió.

Cuestiones relacionadas