Лучше поздно, чем никогда?
Некоторое дополнение к предложению Кейта, которое в основном является правильным.
Правда в том, что вам приходится иметь дело с сортировкой по событию gridView_Sorting.
Нет необходимости в DataBind () GridView ранее, например, в событии Page_Load. Там вы должны вызывать только метод GridView.Sort () вместо .DataBind (). Вот как это происходит:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
Me.gridView.Sort(Request.QueryString("sortExpression"), Request.QueryString("sortDirection"))
End If
End Sub
Теперь давайте посмотрим на событие gridView_Sorting.
Там вы должны подтолкнуть источник данных к правильной сортировке. Сам GridView не справляется с этим (по крайней мере, в этом случае).
Protected Sub gridView_Sorting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles gridView.Sorting
If IsPostBack Then
e.Cancel = True
Dim sortDir As SortDirection = SortDirection.Ascending
If e.SortExpression = Me.Q_SortExpression And Me.Q_SortDirection = SortDirection.Ascending Then
sortDir = SortDirection.Descending
End If
RedirectMe(e.SortExpression, sortDir)
Else
Dim sortExpr As String = e.SortExpression + " " + IIf(e.SortDirection = SortDirection.Ascending, "ASC", "DESC")
Dim dv As System.Data.DataView = Me.dsrcView.Select(New DataSourceSelectArguments(sortExpr))
Me.gridView.DataSource = dv
Me.gridView.DataBind()
End If
End Sub
Нет необходимости кодировать какие-либо функции сортировки в источнике данных, такие как передача параметров сортировки в хранимую процедуру. Вся сортировка происходит в приведенных выше фрагментах кода.
Кроме того, хорошо, если gridView.EnableViewState переключен на False, что делает страницу намного легче для сетевого трафика и для браузера. Можно сделать это, поскольку сетка полностью воссоздается всякий раз, когда страница отправляется обратно.
Хорошего дня!
Martin