Я предпочитаю использовать промежуточную [наблюдаемую] коллекцию, которая содержит отсортированные объекты.Однако это в мире 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
Я знаю, что это не точный ответ, но так как никто не будет вмешиваться, возможно, вы можете взять это, взломать его, пока оно не будет работать изящно, а затем прокомментировать ваше решение для следующего человека.