Ваше желаемое поведение возможно. Вот что вам нужно сделать:
1) Подписаться на событие сортировки GridView.
2) Добавьте выражение SortExpression в столбец создания, например «MyOwnSortExpression».
2) В обработчике событий у вас есть доступ к выражению SortExpression через EventArgs. e.SortExpression
3) Создайте метод, который выполняет привязку данных в GridView.
Этот метод имеет 2 параметра. Первый - это имя столбца, который должен быть отсортирован, а второй - Sortdirection. (было бы неплохо переключить направление сортировки после двойного щелчка по одному и тому же столбцу)
4) Добавьте переключатель кода, который выполняет сортировку вручную только по нужному столбцу.
Пример
protected void gv_Sorting(object sender, GridViewSortEventArgs e)
{
if(e.SortExpression == MyOwnSortExpression)
{
UpdateDataBinding(e.SortExpression, e.SortDirection);
e.Cancel = true;
return;
}
}
protected void UpdateDataBinding(String sortexpression, SortDirection direction)
{
switch(sortExpression)
{
case "MyOwnSortExpression":
var myData = GetYouSpecificDataFromDB();
if(direction == SortDirection.Ascending)
{
var = var.OrderBy(x => string.format("jkalsd{0}", x.TheSpecifiedDBColumn)) // or any desired linq expression);
}
else
{
var = var.OrderByDescending(x => string.format("jkalsd{0}", x.TheSpecifiedDBColumn)) // or any desired linq expression);
}
this.gv.DataSource = var.ToList();
this.gv.DataBind();
break;
}
}
Вы можете добавить кэширование для направления сортировки и столбца сортировки, чтобы включить механизм переключения.
Ваше решение может отличаться в зависимости от типа привязки данных, которую вы делаете (Linq-to-Sql, ObjectDataSource, ...)
Эта ссылка http://blogs.sftsrc.com/stuart/archive/2009/02/19/130.aspx также предоставляет хороший класс. Лучше всего работает, если вы можете создать класс Wrapper, содержащий все значения, которые будут отображаться. Предлагаемое мной решение не нуждается в классе-обертке, но ему не хватает гибкости.