How to Perform Sorting in Gridview in ASP.NET
(Sort Column in Gridview Asp.net) – Đối với các danh sách dữ liệu nhiều, chức năng tìm kiếm, sắp xếp thông tin sẽ giúp người sử dụng nhanh chóng dễ dàng hơn trong việc xem thông tin. Nếu như bạn đã sử dụng Excel thì chức năng này rất quen thuộc khi làm việc. Theo mặc định dữ liệu hiển thị trên Gridview sẽ chưa có chức năng Sort, bài viết dưới đây sẽ hướng dẫn cách bạn cách đưa chức năng Sort vào Gridview. Mỗi khi kích vào tiêu đề một cột dữ liệu nào đó trên Gridview, dữ liệu sẽ được tự động sắp xếp và tại cột sắp xếp sẽ xuất hiện các mũi tên để người sử dụng có thể nhận biết được hướng sắp xếp.
- B1: Tạo CSDL Customers trong SQL Server
- B2: Tạo Bảng Accounts có cấu trúc phía dưới
STT | Tên trường | Kiểu trường | Ghi chú |
1 | AccountID | Int | Trường tự tăng |
2 | AccountCode | nvarchar(25) | |
3 | AccName | nvarchar(250) | |
4 | AccAddress | nvarchar(250) | |
5 | AccPhone | nvarchar(50) | |
6 | AccFAX | nvarchar(50) | |
7 | AccEmail | nvarchar(50) | |
8 | AccWebsite | nvarchar(150) | |
9 | AccDesc | nvarchar(1500) | |
10 | CreatedDate | datetime | |
11 | ModifiedDate | datetime |
- B3: Nhập dữ liệu cho bảng Accounts
- B4: Tạo stored procedure trong SQL Server
USE
[Customers]
GO
CREATE PROCEDURE [dbo].[Pro_Accounts_List]
@Keyword nvarchar(250),
@SortField nvarchar(50),
@SortType nvarchar(10)
AS
declare
@strSQL nvarchar(1000)
declare @strWhere nvarchar(500)
declare @strOrder nvarchar (50)
set @strSQL= 'Select * from Accounts'
set @strWhere =' Where 1=1 '
if @Keyword<>''
set @strWhere= @strWhere +' And (AccountCode like
N''%' +@Keyword+'%''
Or AccName like N''%' +@Keyword+'%'' Or AccAddress like N''%' +@Keyword+'%''
Or AccPhone like N''%' +@Keyword+'%'' Or AccFAX like N''%' +@Keyword+'%''
Or AccEmail like N''%' +@Keyword+'%'' Or AccWebsite like N''%' +@Keyword+'%'')'
if @SortField=''
Begin
set
@strOrder =' Order by
AccName'
End
Else
Begin
set
@strOrder =' Order by '+ @SortField + ' '+ @SortType
End
set @strSQL=@strSQL+@strWhere+@strOrder
print @strSQL
exec sp_executesql @strSQL
Go
- B5: Tạo Project trong Microsoft Visual Studio 2010
Trong Visual Studio tạo 1 Class có tên: Utility và nhập đoạn Code phía dưới cho Class này.
Imports System.Data.SqlClient
Imports System.Data
Namespace PerformSortingInGriview
Public Class SqlDataProvider
#Region "Membres
Prives"
Shared _IsError As Boolean = False
Private _connectionString As
String
#End Region
#Region "Constructeurs"
Public Sub New()
Try
_connectionString = ConfigurationManager.ConnectionStrings("SiteSqlServer").ConnectionString
_IsError = False
Catch ex As Exception
_IsError = True
End Try
End Sub
#End Region
#Region "Proprietes"
Public ReadOnly Property ConnectionString() As
String
Get
Return _connectionString
End Get
End Property
#End Region
#Region "Functions"
Public Function
FillTable(ByVal ProcName As String, ByVal ParamArray
Para() As ObjectPara)
As DataTable
Try
Dim tb As
New DataTable
Dim adap As
New SqlDataAdapter(ProcName,
_connectionString)
adap.SelectCommand.CommandType = CommandType.StoredProcedure
If Not
Para Is Nothing
Then
For Each
p As ObjectPara
In Para
adap.SelectCommand.Parameters.Add(New SqlParameter(p.Name,
p.Value))
Next
End If
adap.Fill(tb)
Return tb
Catch ex As Exception
Return Nothing
End Try
End Function
#End Region
End Class
Public Class ObjectPara
Dim _name As String
Dim _Value As Object
Sub New(ByVal Pname As String, ByVal PValue As Object)
_name = Pname
_Value = PValue
End Sub
Public Property
Name() As String
Get
Return _name
End Get
Set(ByVal value As String)
_name = value
End Set
End Property
Public Property
Value() As Object
Get
Return _Value
End Get
Set(ByVal value As Object)
_Value = value
End Set
End Property
End Class
End Namespace
Chú ý: Thuộc tính SiteSqlServer chính là chuỗi Connect với SQL Server trong file Web.Config
- B6: Download các file ảnh tại đây, copy các file ảnh vào thư mục Images của Project
- B7: Mở file Default.aspx dưới dạng HTML và nhập mã HTML
<%@ Page
Title="Sorting and
Paging with Gridview in ASP.NET" Language="vb" MasterPageFile="~/Site.Master" AutoEventWireup="false" EnableEventValidation= "false" CodeBehind="Default.aspx.vb"
Inherits="PerformSortingInGriview._Default"
%>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<asp:ScriptManager ID="ScriptManager1"
runat="server">
</asp:ScriptManager>
<h3>
Sorting and Paging with Gridview in ASP.NET
</h3>
<asp:UpdatePanel ID="updatePanel"
runat="server"
UpdateMode="Conditional">
<ContentTemplate>
<table cellpadding="2"
cellspacing="3"
width="100%">
<tr>
<td>
</td>
<td
align="right">
<asp:Label ID="plKeyword" runat="server" Text="Keyword"></asp:Label>
<asp:TextBox ID="txtSearch" CssClass="form-control" ToolTip="Enter Keyword" runat="server" width="200px"></asp:TextBox>
<asp:ImageButton ID="cmdQuickSearch" runat="server" causesvalidation="false" imageurl="~/images/icon_search.gif"></asp:ImageButton>
</td>
</tr>
<tr
id="trMessage"
runat="server"
visible="false">
<td
colspan="2">
<asp:Label ID="lblMessage" runat="server" Text="No Data"></asp:Label>
</td>
</tr>
<tr>
<td
colspan="2">
<asp:GridView ID="grvObject" runat="server" AllowPaging="true" PageSize="12" AllowSorting="true"
CssClass="GridStyle"
BorderColor="#cbcbcb"
BorderStyle="solid"
BorderWidth="1"
AutoGenerateColumns="false"
DataKeyNames="AccountID"
width="100%">
<AlternatingRowStyle
CssClass="GridStyle_AltRowStyle"
/>
<HeaderStyle CssClass="GridStyle_HeaderStyle"
/>
<RowStyle CssClass="GridStyle_RowStyle" />
<pagerstyle cssclass="GridStyle_pagination"
/>
<Columns>
<asp:TemplateField HeaderText = "Number">
<ItemStyle HorizontalAlign="Center" Width="2%"></ItemStyle>
<ItemTemplate>
<asp:Label ID="lblRowNumber"
Text='<%# Container.DataItemIndex + 1 %>' runat="server"
/>
<asp:Label ID="lblItemID"
Text='<%# Eval("AccountID") %>' Visible="false"
runat="server"></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField ItemStyle-Width="10%" DataField="AccountCode" HeaderText="AccountCode" SortExpression="AccountCode" />
<asp:BoundField ItemStyle-Width="15%"
DataField="AccName"
HeaderText="AccountName"
SortExpression="AccName"
/>
<asp:BoundField ItemStyle-Width="10%"
DataField="AccPhone"
HeaderText="Phone"
SortExpression="AccPhone"
/>
<asp:BoundField ItemStyle-Width="10%"
DataField="AccFAX"
HeaderText="FAX"
SortExpression="AccFAX"
/>
<asp:BoundField ItemStyle-Width="15%"
DataField="AccEmail"
HeaderText="Email"
SortExpression="AccEmail"
/>
</Columns>
</asp:GridView>
</td>
</tr>
</table>
</ContentTemplate>
</asp:UpdatePanel>
</asp:Content>- B8: Viết Code cho file Default.aspx
C# Code
//Visit http://www.laptrinhdotnet.com
for more ASP.NET Tutorials
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Diagnostics;
namespace SortInGridview
{
public partial class _Default :
System.Web.UI.Page
{
#region
"Const"
private const string ASCENDING = "
ASC";
private const string DESCENDING = "
DESC";
#endregion
#region
"Properties"
private SortDirection
GridViewSortDirection
{
get
{
if (ViewState["sortDirection"]
== null)
{
ViewState["sortDirection"]
= SortDirection.Ascending;
}
return (SortDirection)ViewState["sortDirection"];
}
set { ViewState["sortDirection"]
= value; }
}
public string
SortField
{
get
{
object o = ViewState["SortExpression"];
if (o == null)
{
return "AccName";
}
return Convert.ToString(o);
}
set { ViewState["SortExpression"]
= value; }
}
#endregion
#region
"Bind Data"
private void
BindAccount(string SortExpression)
{
DataTable objBind = new
DataTable();
if (GridViewSortDirection == SortDirection.Ascending)
{
objBind = BindData(SortExpression, DESCENDING);
}
else
{
objBind = BindData(SortExpression,
ASCENDING);
}
if (objBind != null)
{
if (objBind.Rows.Count > 0)
{
grvObject.DataSource = objBind;
grvObject.DataBind();
trMessage.Visible = false;
grvObject.Visible = true;
}
else
{
trMessage.Visible = true;
grvObject.Visible = false;
}
updatePanel.Update();
}
}
private DataTable
BindData(string SortExpression, string SortType)
{
SqlDataProvider objSQL = new
SqlDataProvider();
DataTable objBind = objSQL.FillTable("Pro_Accounts_List", new ObjectPara("@Keyword", txtSearch.Text), new ObjectPara("@SortField", SortExpression), new ObjectPara("@SortType", SortType));
return objBind;
}
#endregion
#region
"GridSort"
private void
AddSortDirectionImage(int columnIndex, GridViewRow headerRow)
{
Image sortImage = new
Image();
if (GridViewSortDirection == SortDirection.Ascending)
{
sortImage.ImageUrl = "~/Images/sortascending.gif";
sortImage.AlternateText = "Ascending
Order";
}
else
{
sortImage.ImageUrl = "~/Images/sortdescending.gif";
sortImage.AlternateText = "Descending Order";
}
headerRow.Cells[columnIndex].Controls.Add(sortImage);
}
private int
GetSortColumnIndex()
{
string SortExpression = "";
foreach (DataControlField
field in grvObject.Columns)
{
if (ViewState["SortExpression"]
!= null)
{
if (field.SortExpression == (string)ViewState["SortExpression"])
{
return grvObject.Columns.IndexOf(field);
}
}
else
{
SortExpression = "AccName";
if (field.SortExpression ==
SortExpression)
{
return grvObject.Columns.IndexOf(field);
}
}
}
return -1;
}
#endregion
#region
"GridView Methods"
protected void grvObject_Sorting(object sender, System.Web.UI.WebControls.GridViewSortEventArgs e)
{
string sortExpression = e.SortExpression;
ViewState["SortExpression"]
= sortExpression;
if (GridViewSortDirection == SortDirection.Ascending)
{
GridViewSortDirection = SortDirection.Descending;
BindAccount(sortExpression);
}
else
{
GridViewSortDirection = SortDirection.Ascending;
BindAccount(sortExpression);
}
}
protected void
grvObject_RowCreated(object sender,
System.Web.UI.WebControls.GridViewRowEventArgs
e)
{
if (e.Row.RowType == DataControlRowType.Header)
{
int sortColumnIndex =
GetSortColumnIndex();
if (sortColumnIndex != -1)
{
AddSortDirectionImage(sortColumnIndex, e.Row);
}
//Add Css for Header
foreach (Control
ctl in e.Row.Controls)
{
foreach (Control
ctl2 in ctl.Controls)
{
if (object.ReferenceEquals(ctl2.GetType().BaseType,
typeof(LinkButton)))
{
((LinkButton)ctl2).CssClass = "OrderBy";
}
}
}
}
}
protected void
grvObject_PageIndexChanging(object sender,
System.Web.UI.WebControls.GridViewPageEventArgs
e)
{
grvObject.PageIndex = e.NewPageIndex;
BindAccount(SortField);
}
#endregion
#region
"Event Handles"
protected void
Page_Load(object sender, System.EventArgs e)
{
try
{
if (!IsPostBack)
{
//Default Submit Button
Page.Form.DefaultButton = cmdQuickSearch.UniqueID;
BindAccount(SortField);
}
}
catch
{
}
}
protected void
cmdQuickSearch_Click(object sender, System.EventArgs e)
{
BindAccount(SortField);
}
#endregion
}
}
VB.NET Code
'Visit http://www.laptrinhdotnet.com for more ASP.NET Tutorials
Imports System.Data.SqlClient
Namespace PerformSortingInGriview
Public Class _Default
Inherits System.Web.UI.Page
#Region "Const"
Private Const
ASCENDING As String
= " ASC"
Private Const
DESCENDING As String
= " DESC"
#End Region
#Region "Properties"
Private Property
GridViewSortDirection() As SortDirection
Get
If ViewState("sortDirection")
Is Nothing Then
ViewState("sortDirection")
= SortDirection.Ascending
End If
Return DirectCast(ViewState("sortDirection"), SortDirection)
End Get
Set(ByVal value As SortDirection)
ViewState("sortDirection")
= value
End Set
End Property
Property SortField() As
String
Get
Dim o As
Object = ViewState("SortExpression")
If o Is Nothing Then
Return "AccName"
End If
Return CStr(o)
End Get
Set(ByVal Value As String)
ViewState("SortExpression")
= Value
End Set
End Property
#End Region
#Region "Bind Data"
Private Sub
BindAccount(ByVal SortExpression As String)
Dim objBind As New DataTable
If GridViewSortDirection = SortDirection.Ascending
Then
objBind = BindData(SortExpression, DESCENDING)
Else
objBind = BindData(SortExpression, ASCENDING)
End If
If Not objBind Is Nothing Then
If objBind.Rows.Count > 0 Then
grvObject.DataSource = objBind
grvObject.DataBind()
trMessage.Visible = False
grvObject.Visible = True
Else
trMessage.Visible = True
grvObject.Visible = False
End If
updatePanel.Update()
End If
End Sub
Private Function
BindData(ByVal SortExpression As String, ByVal SortType As String) As DataTable
Dim objSQL As New SqlDataProvider
Dim objBind As DataTable = objSQL.FillTable("Pro_Accounts_List", New ObjectPara("@Keyword", txtSearch.Text.Trim), _
New ObjectPara("@SortField", SortExpression), _
New ObjectPara("@SortType", SortType))
Return objBind
End Function
#End Region
#Region "GridSort"
Private Sub
AddSortDirectionImage(ByVal columnIndex As Integer, ByVal headerRow As GridViewRow)
Dim sortImage As New Image()
If GridViewSortDirection = SortDirection.Ascending
Then
sortImage.ImageUrl = "~/Images/sortascending.gif"
sortImage.AlternateText = "Ascending
Order"
Else
sortImage.ImageUrl = "~/Images/sortdescending.gif"
sortImage.AlternateText = "Descending
Order"
End If
headerRow.Cells(columnIndex).Controls.Add(sortImage)
End Sub
Private Function
GetSortColumnIndex() As Integer
Dim SortExpression As
String = ""
For Each field As DataControlField
In grvObject.Columns
If Not
ViewState("SortExpression") Is Nothing Then
If field.SortExpression = DirectCast(ViewState("SortExpression"),
String) Then
Return grvObject.Columns.IndexOf(field)
End If
Else
SortExpression = "AccName"
If field.SortExpression = SortExpression
Then
Return grvObject.Columns.IndexOf(field)
End If
End If
Next
Return -1
End Function
#End Region
#Region "GridView
Methods"
Private Sub
grvObject_Sorting(ByVal sender As Object, ByVal e As
System.Web.UI.WebControls.GridViewSortEventArgs)
Handles grvObject.Sorting
Dim sortExpression As
String = e.SortExpression
ViewState("SortExpression")
= sortExpression
If GridViewSortDirection = SortDirection.Ascending
Then
GridViewSortDirection = SortDirection.Descending
BindAccount(sortExpression)
Else
GridViewSortDirection = SortDirection.Ascending
BindAccount(sortExpression)
End If
End Sub
Private Sub
grvObject_RowCreated(ByVal sender As Object, ByVal e As
System.Web.UI.WebControls.GridViewRowEventArgs)
Handles grvObject.RowCreated
If (e.Row.RowType = DataControlRowType.Header)
Then
Dim
sortColumnIndex As Integer
= GetSortColumnIndex()
If sortColumnIndex <> -1 Then
AddSortDirectionImage(sortColumnIndex, e.Row)
End If
'Add Css for Header
For Each
ctl As Control
In e.Row.Controls
For Each
ctl2 As Control
In ctl.Controls
If ctl2.GetType().BaseType Is GetType(LinkButton)
Then
DirectCast(ctl2, LinkButton).CssClass
= "OrderBy"
End
If
Next
Next
End If
End Sub
Private Sub
grvObject_PageIndexChanging(ByVal sender As Object, ByVal e As
System.Web.UI.WebControls.GridViewPageEventArgs)
Handles grvObject.PageIndexChanging
grvObject.PageIndex = e.NewPageIndex
BindAccount(SortField)
End Sub
#End Region
#Region "Event
Handles"
Protected Sub
Page_Load(ByVal sender As
Object, ByVal e
As System.EventArgs)
Handles Me.Load
Try
If Page.IsPostBack = False Then
'Default Submit Button
Page.Form.DefaultButton = cmdQuickSearch.UniqueID
BindAccount(SortField)
End If
Catch ex As Exception
End Try
End Sub
Private Sub
cmdQuickSearch_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles
cmdQuickSearch.Click
BindAccount(SortField)
End Sub
#End Region
End Class
End Namespace
Bây giờ chạy Project bạn sẽ có kết quả như ảnh phía dưới.
Chúc các bạn thành công!
Quang Bình
No Comment to " How to Perform Sorting in Gridview in ASP.NET "