Как сортировать DataGridView при привязке к источнику привязки, который связан с EF4 Entity
У меня есть DataGridView
, связанный с BindingSource
.
My BindingSource
связан с IQueryable
списком сущностей:
public void BindTo(IQueryable elements)
{
BindingSource source = new BindingSource();
source.DataSource = elements;
bindingNavigator1.BindingSource = source;
dataGridView1.DataSource = source;
}
Я хочу, чтобы мои пользователи могли щелкнуть заголовки сетки, чтобы отсортировать данные - изо всех сил пытаться заставить это работать. Является ли это возможным? Если да, то как мне это сделать?
Ответы
Ответ 1
Недавно я боролся с этой же проблемой; кажется, что интерфейс IQueryable не предоставляет достаточной информации для DataViewGrid, чтобы знать, как сортировать данные автоматически; поэтому вам нужно либо переупаковать свою коллекцию из источника Entity, используя что-то, что она может использовать, либо сделать то, что я сделал, и обработать функцию сортировки вручную:
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;
}
Я надеюсь, что это поможет.
Ответ 2
VB.NET
Если вы используете источник привязки с синтаксисом linq, вы можете сортировать свои данные следующим образом
В этом случае При загрузке источника bindnings, связанного с datagridview из объектов фреймворка объекта "NCFile" с наличием внешнего столбца в списке "NCFilePartSet"
bsFileSections.DataSource = From ncfps In NCFile.NCFilePartSet Order By ncfps.Sort Select ncfps
или как это
bsFileSections.DataSource = NCFile.NCFilePartSet.OrderBy(Function(ncfps) ncfps.Sort)
где "Сортировка" представляет собой столбец в NCFilePartSet
Обновления для сущностей продолжают работать и отражаются обратно в базу данных
Ответ 3
Да, может легко иметь сортируемый DGV при привязке к данным EF. Используйте BindingListView
из BLW library (также, проверьте Как реализовать автоматическую сортировку DataGridView?).
public void BindTo(IQueryable elements)
{
BindingSource source = new BindingSource();
source.DataSource = new BindingListView(elements.ToList());
bindingNavigator1.BindingSource = source;
dataGridView1.DataSource = source;
}
В моих тестах, даже когда .ToList()
вызывался внутри конструктора (как указано выше), изменения распространялись на БД, что меня удивило.