Подтвердить что ты не робот

Как сортировать 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;

    }

Я хочу, чтобы мои пользователи могли щелкнуть заголовки сетки, чтобы отсортировать данные - изо всех сил пытаться заставить это работать. Является ли это возможным? Если да, то как мне это сделать?

4b9b3361

Ответ 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() вызывался внутри конструктора (как указано выше), изменения распространялись на БД, что меня удивило.