Reputation: 2665
I googled a lot of times but don't have any userful link for my solution. I have AllwSorting="true" and OnSort function. Today I post this question, thanks for all your help. This is my ASCX:
<asp:GridView ID="gvwCus" runat="server" CssClass="gridview" AlternatingRowStyle-CssClass="even" AutoGenerateColumns="false" GridLines="Vertical" AllowPaging="false" OnRowCommand="RowCommand" AllowSorting="true" OnSorting="gvwCus_OnSorting">
<Columns>
<asp:TemplateField ItemStyle-HorizontalAlign="Center" HeaderStyle-HorizontalAlign="Center" HeaderStyle-Width="4%">
<HeaderTemplate>STT</HeaderTemplate>
<ItemTemplate>
<asp:Label ID="lblId" runat="server" Text="<%#Container.DataItemIndex + 1%>"></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField HeaderStyle-Width="12%" DataField="field1" HeaderText="Field1_Header" ItemStyle-HorizontalAlign="Left" HeaderStyle-HorizontalAlign="Center"/>
<asp:BoundField HeaderStyle-Width="30%" DataField="field2" HeaderText="Field2_Header" ItemStyle-HorizontalAlign="Left" HeaderStyle-HorizontalAlign="Center"/>
<asp:BoundField HeaderStyle-Width="31%" DataField="field3" HeaderText="Field3_Header" ItemStyle-HorizontalAlign="Left" HeaderStyle-HorizontalAlign="Center"/>
<asp:BoundField HeaderStyle-Width="20%" DataField="field4" HeaderText="Field4_Header" ItemStyle-HorizontalAlign="Left" HeaderStyle-HorizontalAlign="Center" />
<asp:CommandField HeaderStyle-Width="2%" ButtonType="Image" SelectImageUrl="~/Images/detail.png" ShowSelectButton="true" />
</Columns>
</asp:GridView>
And my code behind: ASCX.CS, I have gvwCus_OnSorting function for Sort event, but don't have any event handled when I click on the header of gridview.
protected void gvwCus_OnSorting(object sender, GridViewSortEventArgs e)
{
DataBind(e);
}
private void DataBind(GridViewSortEventArgs eventArgs)
{
var dataOracle = new DataOracle();
var data = dataOracle.GetDataTable();
if(eventArgs != null)
{
data.DefaultView.Sort = eventArgs.SortExpression + " " + GetSortDirection(eventArgs.SortExpression);
}
gvwCustom.DataSource = data;
gvwCustom.DataBind();
}
private string GetSortDirection(string column)
{
string sortDirection = "DESC";
string sortExpression = ViewState["SortExpression"] as string;
if (sortExpression != null)
{
if (sortExpression == column)
{
string lastDirection = ViewState["SortDirection"] as string;
if ((lastDirection != null) && (lastDirection == "DESC"))
{
sortDirection = "ASC";
}
}
}
ViewState["SortDirection"] = sortDirection;
ViewState["SortExpression"] = column;
return sortDirection;
}
Thanks!!
Upvotes: 2
Views: 3368
Reputation: 7943
You are not setting SortExpression for the columns you want to sort. Add SortExpression, you will see hyperlinks for each column. Clicking on those links will fire sort event. After adding sortexpression your boundfields should look like:
<asp:BoundField SortExpression="field1" HeaderStyle-Width="12%" DataField="field1" HeaderText="Field1_Header" ItemStyle-HorizontalAlign="Left" HeaderStyle-HorizontalAlign="Center"/>
<asp:BoundField SortExpression="field2" HeaderStyle-Width="30%" DataField="field2" HeaderText="Field2_Header" ItemStyle-HorizontalAlign="Left" HeaderStyle-HorizontalAlign="Center"/>
<asp:BoundField SortExpression="field3" HeaderStyle-Width="31%" DataField="field3" HeaderText="Field3_Header" ItemStyle-HorizontalAlign="Left" HeaderStyle-HorizontalAlign="Center"/>
<asp:BoundField SortExpression="field4" HeaderStyle-Width="20%" DataField="field4" HeaderText="Field4_Header" ItemStyle-HorizontalAlign="Left" HeaderStyle-HorizontalAlign="Center" />
Rendered headers should look like below:
Upvotes: 3