How To Sort Columns In An Asp.net Gridview If Using A Custom Datasource?
Solution 1:
You could also just reassign the datasource.SelectCommand before the DataBind() call in the Sorting handler. Something like this:
protectedvoidgvItems_Sorting(object sender, GridViewSortEventArgs e)
{
GridView gv = (GridView)sender;
SqlDataSource ds = (SqlDataSource)gv.DataSource;
ds.SelectCommand = ds.SelectCommand + " order by "
+ e.SortExpression + " " + GetSortDirection(e.SortDirection);
gvItems.DataSource = ds;
gvItems.DataBind();
}
stringGetSortDirection(string sSortDirCmd)
{
string sSortDir;
if ((SortDirection.Ascending == sSortDirCmd))
{
sSortDir = "asc";
}
else
{
sSortDir = "desc";
}
return sSortDir;
}
I hope this help. Let me know if you need extra help to implement it.
Enjoy!
Solution 2:
First you need to add an event:
<asp:GridView AllowSorting="True" OnSorting="gvName_Sorting" ...
Then that event looks like:
protectedvoidgvName_Sorting(object sender, GridViewSortEventArgs e )
{
...
//rebind gridview
}
You basically have to get your data again.
You're right that it looks messy and there is a better way: ASP.Net MVC
Unfortunately that's a drastically different page model.
Solution 3:
I'm not sure about this one, but if you use a standard SqlDataSource and you click on a field to sort according to that field, the SqlDataSource is populated again with the data and it is rebound to the grid. So the sorting does not happen on the client side and also can be done only when the selectmethod of the SQLDataSource is not DataReader.
When handling the sorting event, do you recreate the SqlDataSource and rebound it to the GridView? Can you put the sort field and direction to the generatedSelectCommand, which you use? Or put it to the SortParameterName property of the SQLDataSource?
I'm absolutely sure that you have to rebound the SqlDataSource to the grid, and since you create it on the fly, you have to populate it again.
Solution 4:
Better late than never?
Some addition for Keith's suggestion which is basically the right one.
Truth is, that you have to deal with sorting on gridView_Sorting event. There is no need to DataBind() the GridView earlier, for example in Page_Load event. There you should only call the GridView.Sort() method instead of .DataBind(). Here is how it goes:
ProtectedSub Page_Load(ByVal sender AsObject, ByVal e As System.EventArgs) HandlesMe.Load
IfNot IsPostBack ThenMe.gridView.Sort(Request.QueryString("sortExpression"), Request.QueryString("sortDirection"))
EndIfEndSubNext let's have a look on gridView_Sorting event.
There you have to push the datasource to the right sorting. GridView itself does not handle that (in this case at least).
ProtectedSub gridView_Sorting(ByVal sender AsObject, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles gridView.Sorting
If IsPostBack Then
e.Cancel = TrueDim sortDir As SortDirection = SortDirection.Ascending
If e.SortExpression = Me.Q_SortExpression AndMe.Q_SortDirection = SortDirection.Ascending Then
sortDir = SortDirection.Descending
EndIf
RedirectMe(e.SortExpression, sortDir)
ElseDim sortExpr AsString = 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()
EndIfEndSubNo need to code any sorting functionality in data source like passing sort parameters to stored procedure. All sorting takes place in the above pieces of code.
Moreover, it's good to have the gridView.EnableViewState switched to False which causes the page to be much lighter for the network traffic and for the browser as well. Can do that as the grid is entirely recreated whenever the page is post back.
Have a nice day!
Martin
Post a Comment for "How To Sort Columns In An Asp.net Gridview If Using A Custom Datasource?"