Comment sortinger DataGridView lorsqu’il est lié à une source de liaison liée à une entité EF4

J’ai un DataGridView qui est lié à un BindingSource .

Mon BindingSource est lié à une liste d’entités IQueryable :

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

Je souhaite que mes utilisateurs puissent cliquer sur les en-têtes de la grid pour sortinger les données et ont du mal à faire en sorte que cela fonctionne. C’est possible? Si oui, comment je le fais?

J’ai récemment lutté avec ce même problème; il semble que l’interface IQueryable ne fournisse pas assez d’informations pour que DataViewGrid sache comment sortinger les données automatiquement; vous devez donc reconditionner votre collection à partir de la source Entity avec quelque chose qu’elle peut utiliser ou faire ce que j’ai fait et gérer manuellement la fonctionnalité de sorting:

  private void myDataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) { DataGridViewColumn column = myDataGridView.Columns[e.ColumnIndex]; _isSortAscending = (_sortColumn == null || _isSortAscending == false); ssortingng direction = _isSortAscending ? "ASC" : "DESC"; myBindingSource.DataSource = _context.MyEntities.OrderBy( ssortingng.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; } 

J’espère que ça aide.

VB.NET

Si vous utilisez une bindingsource avec la syntaxe linq, vous pouvez sortinger vos données comme suit:

Dans ce cas, lors du chargement d’une source de liaison associée à un datagridview à partir d’objects de structure “NCFile” avec une colonne étrangère vers une liste de “NCFilePartSet”

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

ou comme ça

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

où “Sort” est une colonne dans NCFilePartSet

Les mises à jour sur les entités continuent de fonctionner et sont renvoyées à la firebase database.

Oui, il est possible d’avoir facilement un DGV sortingable lorsqu’il est lié à des données EF. Utilisez BindingListView partir de la bibliothèque BLW (également, consultez Comment implémenter le sorting automatique de DataGridView? ).

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

Dans mes tests, même lorsque .ToList() était appelé dans le constructeur (comme ci-dessus), les modifications étaient propagées à la firebase database, ce qui m’a surpris.

Cet extrait de code fonctionne très bien et assez rapidement pour la plupart des applications …

 int iColNumber = 3; //eg, sorting on the 3rd column of the DGV MyBindingSource.DataSource = MyBindingList.OrderByDescending(o => o.GetType().GetProperty(MyDataGridView.Columns[iColNumber].Name).GetValue(o));