In this article I’m going to explain how to perform sorting in ASP.NET GridView. GridView sorting event is raised when the hyperlink to sort a GridView header column is clicked.
GridViewSortEventArgs is used to perform GridView sorting. There are two properties
SortDirection is used sort the GridView column by ascending and descending order.
SortExpression is just the column name that you need to sort.
In GridView first we have to set property AllowSorting="true". If we are using BoundFiled or TemplateFiled we have to use SortExpression property to enable header field name to sort on.
Sample code:
<asp:TemplateField HeaderText="Employee ID" SortExpression="empid">
…
</asp:TemplateField>
In this demo I have used XML to bind the GridView. But you can use database to bind Gridview.
Designer source code:
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Gridview Sorting</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="gvEmployee" runat="server" AutoGenerateColumns="false"
OnSorting="gvEmployee_Sorting" AllowSorting="true">
<HeaderStyle BackColor="#3E3E3E" Font-Bold="True" Font-Names="cambria"ForeColor="White" />
<RowStyle Font-Names="Calibri" />
<Columns>
<asp:TemplateField HeaderText="Employee ID" SortExpression="empid">
<ItemTemplate>
<asp:Label ID="lblEmpID" runat="server" Text='<%#Eval("empid")%>' />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Name" SortExpression="name">
<ItemTemplate>
<asp:Label ID="lblName" runat="server" Text='<%#Eval("name")%>' />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Designation" SortExpression="designation">
<ItemTemplate>
<asp:Label ID="lblDesignation" runat="server"Text='<%#Eval("designation")%>' />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="City" SortExpression="city">
<ItemTemplate>
<asp:Label ID="lblCity" runat="server" Text='<%#Eval("city")%>' />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Country" SortExpression="country">
<ItemTemplate>
<asp:Label ID="lblCountry" runat="server" Text='<%#Eval("country")%>'/>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
</form>
</body>
</html>
C# code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
public partial class _Default : System.Web.UI.Page
{
DataSet ds = new DataSet();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindData();
}
}
protected void BindData()
{
ds.ReadXml(Server.MapPath("EmployeeDetails.xml"));
if (ds != null && ds.HasChanges())
{
gvEmployee.DataSource = ds;
gvEmployee.DataBind();
}
}
public SortDirection dir
{
get
{
if (ViewState["dirState"] == null)
{
ViewState["dirState"] = SortDirection.Ascending;
}
return (SortDirection)ViewState["dirState"];
}
set
{
ViewState["dirState"] = value;
}
}
protected void gvEmployee_Sorting(object sender, GridViewSortEventArgs e)
{
BindData();
DataTable dt = new DataTable();
dt = ds.Tables[0];
{
string SortDir = string.Empty;
if (dir == SortDirection.Ascending)
{
dir = SortDirection.Descending;
SortDir = "Desc";
}
else
{
dir = SortDirection.Ascending;
SortDir = "Asc";
}
DataView sortedView = new DataView(dt);
sortedView.Sort = e.SortExpression + " " + SortDir;
gvEmployee.DataSource = sortedView;
gvEmployee.DataBind();
}
}
}