Как заменить OrderBy из linq.dynami c на OrderBy из обычного linq? - PullRequest
1 голос
/ 27 мая 2020

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

Мне удалось добиться этого с помощью Linq.Dynami c OrderBy, как показано ниже.

  private void dataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
  {
     if (sortAscending)
     {
        notepadDataGridView.DataSource = notes.OrderBy(notepadDataGridView.Columns[e.ColumnIndex].DataPropertyName).ToList();
        notepadDataGridView.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.Ascending;
     }
     else
     {
        notepadDataGridView.DataSource = notes.OrderBy(notepadDataGridView.Columns[e.ColumnIndex].DataPropertyName).Reverse().ToList();
        notepadDataGridView.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.Descending;
     }

     sortAscending = !sortAscending;
  }

Я хочу заменить это обычным OrderBy из System.Linq. Проблема в том, что эта функция принимает лямбда-выражение и делает код длинным, если используется таким образом, и не обслуживается, если у нас есть 20 столбцов для сортировки.

  private void dataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
  {
     if (sortAscending)
     {
        if (notepadDataGridView.Columns[e.ColumnIndex].DataPropertyName == "id")
        {
           notepadDataGridView.DataSource = notes.OrderBy(note => note.Id).ToList();
           notepadDataGridView.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.Ascending;
        }
        else if (notepadDataGridView.Columns[e.ColumnIndex].DataPropertyName == "text")
        {
           notepadDataGridView.DataSource = notes.OrderBy(note => note.Text).ToList();
           notepadDataGridView.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.Ascending;
        }


     }
     else
     {
        //Sort descending
     }

     sortAscending = !sortAscending;
  }

Я ценю любую обратную связь

// Редактировать

// Это запросит таблицу базы данных. Примечание List<Note> notes = nodteLogic.GetNotes();

Объект Note имеет два свойства: Id и Text. Тогда я делаю следующее

notepadBindingSource.DataSource = notes;
notepadDataGridView.DataSource = notepadBindingSource;

DataGrid будет заполнен значениями списка

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Если вы хотите что-то делать с содержимым вашего DataGridView, лучше отделить содержимое от способа его отображения. В WPF это стандартно, в WinForms это приветствуется с использованием BindingList<T>

. Нетрудно создать сортируемый список NotesBindingList, производный от BindingList<Note>. Вам нужно будет включить сортировку и переопределить методы сортировки.

Это даже проще, если вы используете пакет Nuget Equin.ApplicationFramework.BindingListView .

Этот BindingListView дает вы автоматически c сортировку, щелкнув заголовок столбца в правильном направлении.

List<Note> notes = GetNotes();
BindingListView<Note> viewNotes = new BindingListView<Note>(notes);
this.dataGridView1.DataSource = viewNotes;

Этого достаточно, чтобы отобразить ваши заметки. Если вы щелкните заголовок столбца, заметки будут отсортированы в правильном порядке с использованием IComparer по умолчанию. Глифы в заголовках столбцов обновляются автоматически.

Если вам нужен нестандартный порядок сортировки, вам нужно будет предоставить IComparer и вызвать ApplySort(IComparer<T> comparer);

0 голосов
/ 27 мая 2020

Мне удалось использовать обычный linq вот так, спасибо за помощь.

  private void dataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
  {

     if (sortAscending)
     {
        notepadDataGridView.DataSource = notes.OrderBy(note => note.GetType().GetProperty(notepadDataGridView.Columns[e.ColumnIndex].DataPropertyName)
                                                        .GetValue(note, null)).ToList();
        notepadDataGridView.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.Ascending;
     }
     else
     {
        notepadDataGridView.DataSource = notes.OrderBy(note => note.GetType().GetProperty(notepadDataGridView.Columns[e.ColumnIndex].DataPropertyName)
                                                        .GetValue(note, null)).Reverse().ToList();
        notepadDataGridView.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.Descending;
     }

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