У меня есть блокнот таблицы базы данных, в котором для простоты есть два столбца (идентификатор, текст). Я показываю результат своего запроса в 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 будет заполнен значениями списка