Как отсортировать DataGridView, привязанный к коллекции DbSet, в порядке нажатого значения заголовка столбца

#c# #winforms #entity-framework #datagridview

#c# #winforms #entity-framework #datagridview

Вопрос:

Я реализовал приложение Windows form, которое подключается к удаленной базе данных mysql с использованием библиотеки Entity Framework, и когда я впервые отображаю форму, задав источник данных, данные отображаются правильно. Однако, когда я нажимаю заголовок столбца, он не сортирует данные в порядке возрастания или убывания.

Дополнительная информация:

Я установил источник данных для datagridview, используя:

 using (databaseContext db = new databaseContext())
{
    myDataGridView.DataSource = db.someTable.ToArray();
    foreach (DataGridViewColumn column in myDataGridView.Columns)
    {

        myDataGridView.Columns[column.Name].SortMode = DataGridViewColumnSortMode.Automatic;
    }
}
  

Этот код выполняется в событии listLoad для формы, которую я пытаюсь отобразить.

Ответ №1:

Если вы хотите Automatic , чтобы режим сортировки работал для вас, вам необходимо использовать реализацию IBindingList , которая поддерживает сортировку. Используя Entity Framework, ToBindingList метод Local свойства DbSet<T> возвращает сортируемый BindingList<T> :

 //using System.Data.Entity;
using (var db = new MyDbContext())
{
    db.SomeTable.Load();
    dataGridView1.DataSource = db.SomeTable.Local.ToBindingList();
}
  

Примечание:
Сначала вы должны загрузить данные DbSet , вызвав Load or ToList() , чтобы перечислить IQueryable и преобразовать их в фактические данные. Тогда данные находятся в локальном свойстве.

Load включен метод расширения IQueryable и эквивалентен вызову, ToList а затем удалению списка без накладных расходов на фактическое создание списка.

Комментарии:

1. Я попытался использовать это, и теперь, когда я отображаю форму, она не отображает данные, которые находятся в самой таблице.

2. Сначала вы должны загрузить данные. Вероятно, вы забыли загрузить данные.

3. Сначала вы должны Load ввести данные DbSet , вызвав Load или ToList() перечислив IQueryable и преобразовав его в фактические данные. Тогда данные находятся в Local свойстве.