Сортировка «Master-Detail» DataGridView, привязанного к Entity Framework в Winforms - PullRequest
1 голос
/ 13 марта 2012

Я пишу приложение для малого бизнеса на C #, .NET 4.0. Я использую SQL Server CE 4.0 в качестве базы данных.

Я использую Entity Framework для связи в обоих направлениях с базой данных. Мои представления данных связаны с коллекцией Entity Framework, поэтому пользователь может добавлять новые или изменять существующие данные непосредственно в представление данных. Проблема в том, что сортировка с привязкой Entity Framework к сетке данных на самом деле не поддерживается. Из того, что я узнал:

  1. Я могу перехватывать щелчки в ячейках заголовка столбца , а затем выполнять сортировку и перепривязывать результат в таблицу данных. Это немного утомительно, но работает для мастера datagridview. Но когда я делаю это также для "подробного" представления данных ", тогда я теряю автоматическое повторное связывание" подробных "представлений данных (когда выбирается новая строка из основной таблицы). Таким образом, я должен иметь дело с этим также.

  2. Я могу привести запрос к списку / списку привязок и передать его в сортируемый список привязок . Ну, здесь у меня та же проблема с ручным связыванием «подробных» обзоров данных. Возникающая здесь новая проблема заключается в том, что теперь мне нужно как-то исправить сохранение, поскольку новые данные добавляются только в сортируемый список привязок, а не напрямую в контекст Entity Framework.

Что мне делать (и как)? Должен ли я просто использовать DataSets?

1 Ответ

2 голосов
/ 14 марта 2012

Я предпочитаю использовать промежуточную [наблюдаемую] коллекцию, которая содержит отсортированные объекты.Однако это в мире WPF / MVVM.И даже в этом случае шаблон остается относительно одинаковым для ASP.NET ObjectDataSource или MVC с использованием коллекций.Прошло довольно много времени, но, может быть, я смогу немного поразмыслить, где, надеюсь, вы найдете что-нибудь полезное.

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

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

private string SortProperty { get; set; }
private ListSortDirection SortDirection { get; set; }
private ICollection<myItems> items; // Entity Collection
private ObservableCollection<myItems> SortedItems { get; set; } // Sorted Collection

Перегрузите обработчик события OnLoad формы, чтобы зарегистрировать обработчик щелчка по заголовку для применения сортировки.

protected override void OnLoad(EventArgs e)
{
    dataGridView1.ColumnHeaderMouseClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(dataGridView1_ColumnHeaderMouseClick);

    LoadDataGridView();
    base.OnLoad(e);
}

protected override void OnUnload(EventArgs e)
{
    dataGridView1.ColumnHeaderMouseClick -= new System.Windows.Forms.DataGridViewCellMouseEventHandler(dataGridView1_ColumnHeaderMouseClick);
    base.OnUnload(e);
}

Выполните наш начальныйзагрузка отсортированных данных.

private void LoadDataGridView()
{
    items = myRepository.GetAllItems(); // However you get or have your collection of items.
    ApplySort();
    dataGridView1.DataSource = SortedItems;
}

Сортируйте наши данные и сохраните в новой коллекции.Для OrderBy требуется библиотека динамических запросов: http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx.

private void ApplySort()
{
    // IQueryable<myItems>, ICollection<myItems>, ObservableCollection<myItems>... be aware of cross threading and how you will handle updates.
    SortedItems = items.AsQuerable().OrderBy(SortProperty + (SortDirection == ListSortDirection.Ascending ? " asc" : " desc")).ToList();

}

Наш обработчик событий щелчка.Помните, что вам придется обрабатывать добавленные, удаленные и измененные объекты.

private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    var propertyName = GetPropertyName(dataGridView1.Columns[e.ColumnIndex])
    SortDirection = SortProperty == propertyName ?
            SortDirection == ListSortDirection.Ascending ? ListSortDirection.Descending : ListSortDirection.Ascending
        : SortDirection;
    SortProperty = propertyName;
    ApplySort();
    dataGridView1.DataSource = SortedItems;
}

Тривиальный вспомогательный метод сортировки.

private string GetPropertyName(int columnNumber)
{
    switch(columnNumber)
    {
        case 0:
            return "Id";
        case 1:
            return "Name";
        default:
            return "Id";
    }
}

Вот дополнительная информация: http://msdn.microsoft.com/en-us/library/ms171608.aspx

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

...