Как отсортировать DataGridView при привязке к источнику привязки, связанному с объектом EF4 - PullRequest
19 голосов
/ 16 декабря 2010

У меня есть DataGridView, который связан с BindingSource.

Мой BindingSource связан с IQueryable списком лиц:

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

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

    }

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

Ответы [ 4 ]

12 голосов
/ 16 декабря 2010

Я недавно боролся с этой же проблемой;кажется, что интерфейс 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;
  }

Надеюсь, это поможет.

1 голос
/ 19 июня 2018

Этот фрагмент кода работает очень хорошо и достаточно быстро для большинства целей ...

int iColNumber = 3; //e.g., sorting on the 3rd column of the DGV

MyBindingSource.DataSource = MyBindingList.OrderByDescending(o => o.GetType().GetProperty(MyDataGridView.Columns[iColNumber].Name).GetValue(o));
1 голос
/ 30 июля 2013

Да, можно легко иметь сортируемое DGV при привязке к данным EF.Используйте BindingListView из библиотеки BLW (также посмотрите Как реализовать автоматическую сортировку DataGridView? ).

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

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

}

В моих тестахдаже когда в конструкторе был вызван .ToList() (как указано выше), изменения были переданы в БД, что меня удивило.

1 голос
/ 29 января 2013

VB.NET

Если вы используете источник привязки с синтаксисом linq, вы можете отсортировать данные следующим образом

В этом случае при загрузке источника привязки, связанного с сеткой данных из объектов фреймворка объекта «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

Обновления сущностей продолжают работать и отражаются обратно в базу данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...