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));