ASP.NET中实现DataGrid数据排序

asp.net|datagrid|排序|数据

  Visual Studio .Net为编写WinForm程序(即:在Windows平台下运行的程序)所提供的DataGrid组件比起微软以往的各种开发环境中提供的DataGrid组件都要"高级"许多。其"高级"的地方就在于不需要再进行任何其他设置或编程,DataGrid就能够对其中的数据分别按照升、降序进行排列。这种"高级"功能给我们编程提供了许多方便。图01是在WinForm程序中的DataGrid组件按照"EmployeeID"升序进行排列时的界面:


图01:在WinForm程序中使用DataGrid对数据进行排序

  此时很多的朋友肯定会问这样的问题,Visual Studio .Net不仅为编写WinForm程序提供了DataGrid组件,同样也为编写WebForm程序(即:ASP.NET页面程序)提供了DataGrid组件,那么在WebForm中的DataGrid是否也像在WinForm中的DataGrid那样具备这样"高级"的功能?答案是:虽然微软为WebForm提供的DataGrid组件也考虑了数据排序功能,但却不像为编写WinForm程序提供的DataGrid组件在实现数据排序功能上的操作步骤那么简单,在ASP.NET页面中要实现DataGrid组件的数据排序需要设定组件的某些属性和加入一些处理代码才可以实现。本文就将详细讨论一下这个问题。

  一.本文中介绍的程序的设计和运行环境:

  (1).视窗2000高级服务器版

  (2).Visual Studio .Net中文正式版,.Net FrameWork SDK版本号3705

  二.ASP.NET页面中DataGrid实现数据排序的实现原理:

  在ASP.NET页面中实现DataGrid的数据绑定数据排序,有二种实现方法,这二种方法有异曲同工之效,具体如下:

  1. 在实现ASP.NET页面中的DataGrid组件数据绑定时,设定DataGrid组件数据源使用的是DataView,DataView有一个属性"Sort"。通过"Sort"属性设定此数据源以何排序和排序的方式(即升、降序),从而实现对DataGrid中数据排序。

  2. 通过设定Sql语句,为数据绑定产生不同的DataSet,从而实现DataGrid中的数据排序。

  这二种方法虽然能够实现相同的功能,但第一种方法实现较简单,但实现功能有限,

  第二种方法虽然实现起来较复杂,但却可以以此实现较强大的功能。但无论那一种方法,实现DataGrid的数据绑定是首先要完成的。下面首先介绍DataGrid数据绑定的实现方法:

 三.ASP.NET中DataGrid组件数据绑定实现步骤:

  在ASP.NET中实现DataGrid组件的数据绑定方法和在WinForm中数据绑定的方法基本相似。下面是在ASP.NET实现DataGrid组件数据绑定的实现步骤:

  1. 启动Visual Studio .Net。

  2. 选择菜单【文件】|【新建】|【项目】后,弹出【新建项目】对话框。

  3. 将【项目类型】设置为【Visual C#项目】。

  4. 将【模板】设置为【ASP.NET Web 应用程序】。

  5. 在【位置】的文本框中输入"http://localhost/dataGridSort"。然后单击【确定】按钮,这样在Visual Studio .Net就会在当前项目文件所在目录中建立一个名称为"dataGridSort"文件夹,里面存放是此项目的项目文件,项目中的其他文件存放的位置是IIS默认的Web站点所在的目录。具体如图02所示:


图02:新建一个ASP.NET项目对话框

  6. 把Visual Studio .Net当前窗口切换到WebForm的设计窗口,并从【工具箱】|【Web组件】选项卡中拖入一个DataGrid组件到WebForm的设计窗口,名称为DataGrid1。

  7. 选中DataGrid1,单击鼠标右键,在弹出的菜单中【自动套用格式】。并在弹出的【自动套用格式】对话框中的【选择方案】栏中选择【专业型 1】。

  8. 设定DataGrid1的字体大小为"X-Small"。此时的DataGrid1为图03所示:


图03:设计后的DataGrid组件样式

  9. 把Visual Studio .Net的当前窗口切换到WebForm的代码编辑窗口,即:WebForm1.aspx.cs文件的编辑窗口。

  10. 在WebForm1.aspx.cs文件首部,用下列代码替换WebForm1.aspx.cs中导入命名空间的代码:

using System ;
using System.Collections ;
using System.ComponentModel ;
using System.Data ;
using System.Drawing ;
using System.Web ;
using System.Web.SessionState ;
using System.Web.UI ;
using System.Web.UI.WebControls ;
using System.Web.UI.HtmlControls ;
using System.Data.SqlClient ;
11. 在WebForm1.aspx.cs文件的Page_Load事件代码区添加下列代码,下列代码是实现DataGrid组件的数据绑定:
SqlConnection sqlConnection1 = new SqlConnection ( "Server = localhost ; Database = NorthWind ; User ID = sa ; Password = ; " ) ;
//定义数据库连接
DataSet dataSet1 ;
//创建数据集对象
SqlDataAdapter sqlDataAdapter1 ;
sqlDataAdapter1 = new System.Data.SqlClient.SqlDataAdapter ( "SELECT EmployeeID as 序号 , LastName as 姓氏 , FirstName as 名字 , Title as 职务 , Birthdate as 生日 From Employees" , sqlConnection1 ) ;
//以定义的数据库连接来初始化SqlDataAdapter实例
dataSet1 = new DataSet ( ) ;
sqlDataAdapter1.Fill ( dataSet1 , "employee" ) ;
//以SqlDataAdapter实例来填充本地DataSet数据集
DataView dataView1 = dataSet1.Tables [ "employee" ].DefaultView ;
DataGrid1.DataSource = dataView1 ;
DataGrid1.DataBind ( ) ;
//实现数据绑定

  12. 在上述步骤都正确执行后,实现DataGrid数据绑定的全部工作就完成了,如果你使用的是其他类型数据库,只需对对第十一步骤介绍的代码中的定义数据连接加以相应的修改就可以了。请各位读者注意上述代码中设定DataGrid的中文标头的实现方法。此时单击快捷键F5,就可以得到如下界面:


图04:在ASP.NET页面中DataGrid实现数据绑定时的界面
  四.使用DataView实现DataGrid数据排序:

  下面就来介绍在上面介绍的项目基础上使用DataView实现项目中的DataGrid的数据排序,以下面是在上述项目基础上实现DataGrid数据排序的步骤:

  1. 把Visual Stuido .Net当前窗口切换到WebForm的设计界面,并设定DataGrid1组件的"AllowSorting"属性值为"True"。则此时的DataGrid1组件的列头就多了一个超链接。并且在单击此超链接时,返回列头的显示的字符串。DataView就是根据这个返回的字符串来实现DataGrid的数据排序的。图05是设定DataGrid1的"AllowSorting"属性值为"True"后,在WebForm中的模样:


图05:设定"AllowSorting"属性值为"True"后的DataGrid1

  2. 把Visual Studio .Net的当前窗口切换到WebForm1.aspx.cs的代码编辑窗口。并在WebForm1.aspx.cs的InitializeComponent过程中添加下列代码,下列代码是定义DataGrid1的"SortCommand"事件,此事件是在单击DataGrid1列头的超链接时被触发:

this.DataGrid1.SortCommand += new System.Web.UI.WebControls.DataGridSortCommandEventHandler ( this.DataGrid1_SortCommand ) ;

  3. 在WebForm1.aspx.cs的class代码区中添加下列代码,下列代码是定义全局变量,请注意下面定义的变量都是Static类型的:

public static bool blId = true ;
//用以标识DataGrid组件是否已"序号"进行升序排列
public static bool blLast = false ;
//用以标识DataGrid组件是否已"姓氏"进行升序排列
public static bool blFirst=false ;
//用以标识DataGrid组件是否已"名字"进行升序排列
public static bool blTitle= false ;
//用以标识DataGrid组件是否已"职位"进行升序排列
public static bool blBirth =false ;
//用以标识DataGrid组件是否已"生日"进行升序排列

  4. 在WebForm1.aspx.cs中的Page_Load事件处理代码后,添加下列代码,下列代码是定义sort过程,此过程的功能是根据选择不同的列,实现对此列数据的升级序排列:

private void Sort ( string sortString )
{
SqlConnection sqlConnection1 = new SqlConnection ( "Server = localhost ; Database = NorthWind ; User ID = sa ; Password = ; " ) ;
//定义数据库连接
DataSet dataSet1 ;
//创建数据集对象
SqlDataAdapter sqlDataAdapter1 ;
sqlDataAdapter1 = new System.Data.SqlClient.SqlDataAdapter ( "SELECT EmployeeID as 序号, LastName as 姓氏 , FirstName as 名字 , Title as 职务 , Birthdate as 生日 From Employees" , sqlConnection1 ) ;
//以定义的数据库连接来初始化SqlDataAdapter实例
dataSet1 = new DataSet ( ) ;
sqlDataAdapter1.Fill ( dataSet1 , "employee" ) ;
//以SqlDataAdapter实例来填充本地DataSet数据集
DataView dataView1 = dataSet1.Tables [ "employee" ].DefaultView ;
switch ( sortString )
{
case "序号" :
if ( blId )
{
dataView1.Sort = "序号 DESC" ;
blId = false ;
}
else
{
dataView1.Sort = "序号 ASC" ;
blId = true ;
}
break ;
case "姓氏" :
if ( blLast )
{
dataView1.Sort = "姓氏 DESC" ;
blLast = false ;
}
else
{
dataView1.Sort = "姓氏 ASC" ;
blLast = true ;
}
break ;
case "名字" :
if ( blFirst )
{
dataView1.Sort = "名字 DESC" ;
blFirst = false ;
}
else
{
dataView1.Sort = "名字 ASC" ;
blFirst = true ;
}
break ;
case "职务" :
if ( blTitle )
{
dataView1.Sort = "职务 DESC" ;
blTitle = false ;
}
else
{
dataView1.Sort = "职务 ASC" ;
blTitle = true ;
}
break ;
case "生日" :
if ( blBirth )
{
dataView1.Sort = "生日 DESC" ;
blBirth = false ;
}
else
{
dataView1.Sort = "生日 ASC" ;
blBirth = true ;
}
break ;
}
DataGrid1.DataSource = dataView1 ;
DataGrid1.DataBind ( ) ;
//实现数据绑定
}

  5. 清除WebForm1.aspx.cs中Page_Load事件处理代码区中的所有代码后,并在Page_Load事件处理代码区中添加下列下列代码,下列代码是判断此Web页面是否是第一次加载,如果判断为"True",则对其中的DataGrid1中的数据按照"序号"列名进行升序排列:

if ( IsPostBack == false )
{
Sort ( "序号" ) ;
}

  6. 在WebForm1.aspx.cs中的InitializeComponent过程之后,添加下列代码,下列代码是DataGrid1的SortCommand事件的处理代码:

private void DataGrid1_SortCommand ( object source , System.Web.UI.WebControls.DataGridSortCommandEventArgs e )
{
string sColName = e.SortExpression ;
//获得列名
Sort ( sColName ) ;
//以此列名,并根据当前排序情况进行相应排序
}

  7. 在上述步骤都正确执行后,第一种在ASP.NET实现DataGrid中数据排序的方法就介绍完成了,此时单击快捷键F5就可以运行程序,图06和图07分别程序按照"生日"对DataGrid进行升、级序排列时的运行界面:


图06:以"生日" 对DataGrid中的数据进行升序排列


图07:以"生日" 对DataGrid中的数据进行降序排列
 五.使用Sql语句实现DataGrid数据排序:

  使用Sql语句来实现对DataGrid组件中数据排序,在操作步骤上虽然相对复杂一点,但功能相对强大一点。其主要思路就是根据DataGrid组件的不同列名,形成不同的Sql语句,从而得到不同的DataSet实例,来实现对DataGrid中数据进行相应排序。下面就在上面完成的【在ASP.NET页面中使用DataView实现DataGrid数据排序】项目基础上,加以修改从而完成使用Sql语句来实现DataGrid中数据排序。

  1. 首先假设您已经成功完成上面项目,能够在ASP.NET使用DataView实现对DataGrid中数据进行排序。

  2. 把Visual Stuido .Net的当前窗口切换到WebForm1.aspx.cs中,并WebForm1.aspx.cs文件的class代码区添加下列代码,下列代码是创建全局使用的实例:

public DataSet dataSet1 ;
public SqlDataAdapter sqlDataAdapter1 ;

  3. 用下列代码替换WebForm1.aspx.cs中已经定义的sort过程,下面代码是重新定义sort过程,使其能够使用Sql语句实现对DataGrid中的数据进行排序:

private void Sort ( string sortString )
{
SqlConnection sqlConnection1 = new SqlConnection ( "Server = localhost ; Database = NorthWind ; User ID = sa ; Password = ; " ) ;
switch ( sortString )
{
case "序号" :
if ( blId )
{
sqlDataAdapter1 = new System.Data.SqlClient.SqlDataAdapter ( "SELECT EmployeeID as 序号, LastName as 姓氏 , FirstName as 名字 , Title as 职务 , Birthdate as 生日 From Employees ORDER BY 序号 ASC" , sqlConnection1 ) ;
//以定义的数据库连接来初始化SqlDataAdapter实例
blId = false ;
}
else
{
sqlDataAdapter1 = new System.Data.SqlClient.SqlDataAdapter ( "SELECT EmployeeID as 序号, LastName as 姓氏 , FirstName as 名字 , Title as 职务 , Birthdate as 生日 From Employees ORDER BY 序号 DESC" , sqlConnection1 ) ;
//以定义的数据库连接来初始化SqlDataAdapter实例
blId = true ;
}
break ;
case "姓氏" :
if ( blLast )
{
sqlDataAdapter1 = new System.Data.SqlClient.SqlDataAdapter ( "SELECT EmployeeID as 序号, LastName as 姓氏 , FirstName as 名字 , Title as 职务 , Birthdate as 生日 From Employees ORDER BY 姓氏 ASC" , sqlConnection1 ) ;
//以定义的数据库连接来初始化SqlDataAdapter实例
blLast = false ;
}
else
{
sqlDataAdapter1 = new System.Data.SqlClient.SqlDataAdapter ( "SELECT EmployeeID as 序号, LastName as 姓氏 , FirstName as 名字 , Title as 职务 , Birthdate as 生日 From Employees ORDER BY 姓氏 DESC" , sqlConnection1 ) ;
//以定义的数据库连接来初始化SqlDataAdapter实例
blLast = true ;
}
break ;
case "名字" :
if ( blFirst )
{
sqlDataAdapter1 = new System.Data.SqlClient.SqlDataAdapter ( "SELECT EmployeeID as 序号, LastName as 姓氏 , FirstName as 名字 , Title as 职务 , Birthdate as 生日 From Employees ORDER BY 名字 ASC" , sqlConnection1 ) ;
//以定义的数据库连接来初始化SqlDataAdapter实例
blFirst = false ;
}
else
{
sqlDataAdapter1 = new System.Data.SqlClient.SqlDataAdapter ( "SELECT EmployeeID as 序号, LastName as 姓氏 , FirstName as 名字 , Title as 职务 , Birthdate as 生日 From Employees ORDER BY 名字 DESC" , sqlConnection1 ) ;
//以定义的数据库连接来初始化SqlDataAdapter实例
blFirst = true ;
}
break ;
case "职务" :
if ( blTitle )
{
sqlDataAdapter1 = new System.Data.SqlClient.SqlDataAdapter ( "SELECT EmployeeID as 序号, LastName as 姓氏 , FirstName as 名字 , Title as 职务 , Birthdate as 生日 From Employees ORDER BY 职务 ASC" , sqlConnection1 ) ;
//以定义的数据库连接来初始化SqlDataAdapter实例
blTitle = false ;
}
else
{
sqlDataAdapter1 = new System.Data.SqlClient.SqlDataAdapter ( "SELECT EmployeeID as 序号, LastName as 姓氏 , FirstName as 名字 , Title as 职务 , Birthdate as 生日 From Employees ORDER BY 职务 DESC" , sqlConnection1 ) ;
//以定义的数据库连接来初始化SqlDataAdapter实例
blTitle = true ;
}
break ;
case "生日" :
if ( blBirth )
{
sqlDataAdapter1 = new System.Data.SqlClient.SqlDataAdapter ( "SELECT EmployeeID as 序号, LastName as 姓氏 , FirstName as 名字 , Title as 职务 , Birthdate as 生日 From Employees ORDER BY 生日 ASC" , sqlConnection1 ) ;
//以定义的数据库连接来初始化SqlDataAdapter实例
blBirth = false ;
}
else
{
sqlDataAdapter1 = new System.Data.SqlClient.SqlDataAdapter ( "SELECT EmployeeID as 序号, LastName as 姓氏 , FirstName as 名字 , Title as 职务 , Birthdate as 生日 From Employees ORDER BY 生日 DESC" , sqlConnection1 ) ;
//以定义的数据库连接来初始化SqlDataAdapter实例
blBirth = true ;
}
break ;
}
dataSet1 = new DataSet ( ) ;
sqlDataAdapter1.Fill ( dataSet1 , "employee" ) ;
//以SqlDataAdapter实例来填充本地DataSet数据集
DataGrid1.DataSource = dataSet1 ;
DataGrid1.DataBind ( ) ;
//实现数据绑定
}

  4. 保存上面的修改步骤,这样就实现了从DataView到Sql语句实现DataGrid数据排序的转换。单击快捷键F5,就可以看到图06和图07所示界面。

  六.总结:

  通过以上内容的介绍,我们不仅了解、掌握了在ASP.NET页面中实现DataGrid中数据排序的二种方法,还应该了解并掌握下面内容:

  1. 在ASP.NET中的DataGrid组件的数据绑定。  

  2. 改变ASP.NET页面中的DataGrid组件中的表头提示内容。

时间: 2024-10-01 00:00:29

ASP.NET中实现DataGrid数据排序的相关文章

[转]asp.net中对DataTable数据进行排序、检索、合并、分页、统计

asp.net中对DataTable数据进行排序.检索.合并.分页.统计    一.排序 1 获取DataTable的默认视图 2 对视图设置排序表达式 3 用排序后的视图导出的新DataTable替换就DataTable (Asc升序可省略,多列排序用","隔开) DataView dv = dt.DefaultView; dv.Sort = "id Asc,name Desc"; dt = dv.ToTable(); 二.检索 1 设置查询字符串 2 使用Sel

ASP.NET中利用DataGrid实现高效分页

asp.net|datagrid|分页 ASP.Net中的DataGrid有内置分页功能, 但是它的默认的分页方式效率是很低的,特别是在数据量很大的时候,用它内置的分页功能几乎是不可能的事,因为它会把所有的数据从数据库读出来再进行分页, 这种只选取了一小部分而丢掉大部分的方法是不可去取的. 在最进的一个项目中因为一个管理页面要管理的数据量非常大,所以必须分页显示,并且不能用DataGrid的内置分页功能,于是自己实现分页. 下面介绍一下我在项目中用到的分页方法. 当然显示控件还是用DataGri

ASP.NET中利用DataGrid的自定义分页功能

asp.net|datagrid|分页 ASP.NET中利用DataGrid的自定义分页功能和存储过程结合实现高效分页 ASP.Net中的DataGrid有内置分页功能, 但是它的默认的分页方式效率是很低的,特别是在数据量很大的时候,用它内置的分页功能几乎是不可能的事,因为它会把所有的数据从数据库读出来再进行分页, 这种只选取了一小部分而丢掉大部分的方法是不可去取的. 在最进的一个项目中因为一个管理页面要管理的数据量非常大,所以必须分页显示,并且不能用DataGrid的内置分页功能,于是自己实现

asp.net中显示DataGrid控件列序号的几种方法

asp.net|datagrid|datagrid控件|显示 asp.net中显示DataGrid控件列序号的几种方法 作者:郑佐 2004-9-10 在aps.net中多数据绑定的控件很多,论功能来说,应该属DataGrid最为齐全,但它没有提供现成的显示记录序号的功能,不过我们可以通过它所带的一些参数来间接得到序号,下面来看看怎样得到和显示序号值计算方式如下: (1)在后台 DataGrid.CurrentPageIndex * DataGrid.PageSize + e.Item.Item

在ASP.NET中访问DataGrid中所有控件的值

asp.net|datagrid|访问|控件 要在ASP.NET中访问DataGrid中所有控件的值,可以遍历DataGrid中每个控件:下面就是实现这一功能的aspx代码和脚本代码[VB.NET]: <%@ Page Language="vb" AutoEventWireup="false" Codebehind="DataGridAccessValues.aspx.vb" Inherits="aspxWeb.DataGridA

ASP.NET中MVC传递数据的几种形式总结_实用技巧

本文实例讲述了ASP.NET中MVC传递数据的几种形式.分享给大家供大家参考.具体如下: 在Asp.net mvc开发中,Controller需要向View提供Model,然后View将此Model渲染成HTML.这篇文章介绍三种由Controller向View传递数据的方式,实现一个DropDownList的显示. 第一种:ViewData ViewData是一个Dictionary.使用非常简单,看下面代码: public ActionResult ViewDataWay(int id) {

ASP.NET中访问DataGrid中所有控件值的方法_实用技巧

本文实例讲述了ASP.NET中访问DataGrid中所有控件值的方法.分享给大家供大家参考,具体如下: <%@ Page Language="C#" %> <%@ import Namespace="System.Collections" %> <script runat="server"> void Page_Load(Object sender, EventArgs e) { if(!Page.IsPost

ASP.NET中Web DataGrid的使用指南

asp.net|datagrid|web 很久以前就想写一些关于DataGrid/DataList的东西,但是一直以来,一方面自感所学未深,另一方面,总觉无从下笔,一拖再拖,离刚开始的念头已距一年有余.DataGrid/DataList在ASP.NET中的重要性,想必就不用我再强调了,凡显示Table类型的数据,大多会使用这两个控件(当然,如果谁还像ASP那样写ASP.NET,那我也没有办法),所以,每个人可能都有自己的领悟,这篇文章,算是抛砖引玉,为大家做个铺垫. 一.方法1.DataBind

ASP.NET中为DataGrid添加合计字段_实用技巧

论坛中最常见的一个问题是:" 我怎样在 DataGrid 中显示列合计?". 我亲自多次为这个问题提供了示例代码,因此,我想在DotNetJunkies 的标题中提供这么一份指南. 在这份指南中你将会学到怎样在 DataGrid 中编程实现对某一列的值进行统计,并在 DataGrid 的页脚中显示其合计值.这份指南中供下载的示例中包括了 C# 和 Visual Basic.NET 两种代码. 这份指南的最终结果看起来像这样: 从上图可看出: 上面所用到的屏幕图片中的 DataGrid