ASP.NET带给我们很多惊喜,强大的Web Form控件自然是其中的重要部分。这其中,最受关注的当然是Datagrid。在ASP中用HTML标记语法来输出数据的方法在Datagrid数据绑定面前显得如此繁杂。但是只使用Datagrid自身的功能,还是达不到实际的工作要求。本文就是给大家演示如何提高我们的工作效率、降低服务器的负载压力。
1. Datagrid的分页显示
当查
                       图1 分页设置
2. 自定义导航栏
在图1的属性页中的"格式"栏中,我们可以设置"页导航"的外观样式。但是很多程序设计人员都喜欢用自己定义的导航栏,而不使用默认的上下页按钮或数字按钮(即出现1、2、3……页号的形式)。那么我们可以这样来做:
(1)       如果要保留默认的导航栏,请不用看这一小节。如果要隐藏起默认的页导航栏。就请将PageStyle的visible属性设置为false。或在图1"页导航"中,不勾选"显示导航按钮"即可。
(2)       在写自定义导航栏时,主要是利用CurrentPageIndex属性来设置页:
"第一页":
DataGrid1.CurrentPageIndex = 0;
"上一页":
if (DataGrid1.CurrentPageIndex > 0)
DataGrid1.CurrentPageIndex -= 1;
"下一页":
if (DataGrid1.CurrentPageIndex < (DataGrid1.PageCount - 1))
DataGrid1.CurrentPageIndex += 1;
"最后一页":
DataGrid1.CurrentPageIndex = (DataGrid1.PageCount - 1);
(3)       需要注意的是:Web Form是一种无状态的编程方式,我们在自定义了导航栏按钮的代码后,需要再次加载Datagrid的数据源。否则将看不到页切换的效果。也就是说,我们需要在按钮的click事件中加入重新加载数据源的代码,比如我们可以将加载的代码写在如下方法SetGridSource中,在按钮Click的代码最后加入SetGridSource()这句调用代码。
private void SetGridSource()
{
SqlConnection MyConnection = new SqlConnection(YourOwnConnectionString);
string SelectCommand = "SELECT * FROM YOURTABLE";
SqlDataAdapter MyCommand = new SqlDataAdapter(SelectCommand, MyConnection);
DataSet ds = new DataSet();
MyCommand.Fill(ds, " YOURTABLE ");
DataView dv = ds.Tables["YOURTABLE "].DefaultView;
DataGrid1.DataSource = dv;
DataGrid1.DataBind();
}
或者我们可以在Page_load中写入SetGridSource里的代码,使浏览器在页切换重置时可以重新加载并绑定Datagrid的数据源。要注意的是,上述代码不能写在首次加载判断 if (!IsPostBack)语句中
(4) 在页面上我们一般需要显示总页数与当前页面这样的信息。与WinForm中的Datagrid不同的是,在WinForm中需要获取与数据相关的信息,只能从Datagrid的数据源,比如DataTable中去获得数据行数,某单元格的值等信息。被WinForm中的dataset与datagrid之间的关系弄得头晕的朋友就不用再害怕了,在WebForm中,我们只要从Datagrid中就可以直接获得这些信息了。总页数是Datagrid的PageCount属性;当前页数是CurrentPageIndex属性值+1来表示,这是由于CurrentPageIndex是从0开始计数的。
3. 自定义分页
采用Datagrid属性生成器中的分页方式,我们都会感觉到方便的欣喜。但是,用上面所说的方法,每次页切换时,都会用SELECT * FROM YOURTABLE这样的SQl语句去提取出全部的数据,而没有任何与页有关的筛选器。这大大降低了我们Web程序的效率,也增加了服务器的负担。Datagrid提供的分页特点也变得名不副实。我们希望分页能真正的实现减少每次下载的数据量的功能,就要写代码控制住每次提取的数据量大小。
要使用自定义分页,就要将 AllowCustomPaging 属性设置为 true。然后基于 PageSize 和 VirtualItemCount 属性的值计算要显示 DataGrid 控件中每一项所需的页数。
PageSize表示的是在 DataGrid 控件的单页上显示的项数,默认值为10。
VirtualItemCount表示的是总数目。那么页数自然是VirtualItemCount/PageSize
(1)       当然是首先要知道一共有多少条数据,然后我们才好进行分配,写在Page_load里:
if (!IsPostBack)
{
StartIndex = 0;//StartIndex是int类型的公用变量
SqlConnection MyConnection = new SqlConnection(YourOwnConnectionString);
SqlCommand MyCommand = new SqlCommand("SELECT mycount = COUNT(*) FROM Table",MyConnection);
MyConnection.Open();
SqlDataReader dr = MyCommand.ExecuteReader(CommandBehavior.SingleRow);
if (dr.Read())
DataGrid1.VirtualItemCount = (int)dr["mycount"];
dr.Close();
MyConnection.Close();
SetGridSource(StartIndex, "上一页");//看看现在的形参有什么不同哦
}
注:这里说一个本文研究范围之外的知识点,就是上面dr的赋值代码中,我们用的是MyCommand.ExecuteReader(CommandBehavior.SingleRow),而大家一般用的只是MyCommand.ExecuteReader(),但请记住,如果返回记录集只有一行的话,用CommandBehavior.SingleRow进行标识可以提高应用程序的执行效率。这是因为不注明的一般情况下,MyCommand执行是使用 IRowset 接口。而注明了之后,就会利用IRow 接口(如果可用)执行绑定。其中的差别请关注笔者的后续作品。
(2)         现在的主要变化当然在重新绑定数据源的方法SetGridSource中。我们给该方法加入两个输入参数:当前的页面、发出控制(即判断用户点击的是"上一页"还是"下一页"等按钮)。下面的代码主要实现按钮型导航栏,有两个按钮"上一页"与"下一页"。"第一页"与"最后一页"的写法,请网友们自行实现。在如下示例中,column1为数据表之主键。每页有5行数据。
private void SetGridSource (int StartPosition, string GoToPage)
{
 SqlConnection MyConnection = new  SqlConnection(YourOwnConnectionString);
 SqlCommand MyCommand = null;
 switch (GoToPage)
 {
  case "上一页":
      MyCommand = new
         SqlCommand("SELECT TOP 5 * FROM Table WHERE column1 >= @ID ORDER BY column1",MyConnection);
      if (StartPosition == 0)
        MyCommand.Parameters.Add("@ID",SqlDbType.NVarChar, 10).Value = "";//这里参数10是ID字段的长度
      else
        MyCommand.Parameters.Add("@ID",SqlDbType.NVarChar,10).Value =
                ViewState[(DataGrid1.CurrentPageIndex + 1).ToString()];
break;
  case "下一页":
      MyCommand = new
         SqlCommand("SELECT TOP 5 * FROM Table WHERE column1 > @ID ORDER BY column1",MyConnection);//注意:这里用的是>,不是>=哟
      MyCommand.Parameters.Add("@ID", SqlDbType.NVarChar,10).Value = DataGrid1.Items[4].Cells[0].Text;//Items[4]表示第5行即每页显示的最后一行
      break;
 }
 MyConnection.Open();
 SqlDataReader dr = MyCommand.ExecuteReader();
 DataGrid1.DataSource = dr;
 DataGrid1.DataBind();
 dr.Close();
 MyConnection.Close();
  //用ViewState来缓存刚才访问过的那一页的第一行中的主键值
 ViewState[(DataGrid1.CurrentPageIndex + 1).ToString()]=DataGrid1.Items[0].Cells[0].Text;
}
注:如果是oracle数据库,可以在where条件中用rownum来控制上下页的条数与内容。
请在按扭的click事件里的最后调用SetGridSource方法,参数
StartPosition= DataGrid1.CurrentPageIndex *DataGrid1.PageSize;
[参考]关于Datagrid分页的更详细的内容,可以参看华中科技大学出版社出版的章立民先生所著之《用实例学ASP.NET--使用VB.NET与ADO.NET》一书

Web Form中的Datagrid的自定义分页相关推荐

  1. Henry手记—Web Form中的Datagrid的自定义分页 (转)

    Henry手记-Web Form中的Datagrid的自定义分页 (转)[@more@]  Henry手记-web Form中的Datagrid的自定义分页XML:namespace prefix = ...

  2. Henry手记—Web Form中的Datagrid的自定义分页

             Henry手记-Web Form中的Datagrid的自定义分页 韩睿  ( 05/31/2003) ASP.NET带给我们很多惊喜,强大的Web Form控件自然是其中的重要部分. ...

  3. Henry手记—Web Form中的Datagrid的自定义分页(转)

    原文:http://blog.csdn.net/Latitude/archive/2003/06/02/17227.aspx 韩睿  ( 05/31/2003) ASP.NET带给我们很多惊喜,强大的 ...

  4. ASP.NET中利用DataGrid的自定义分页功能和存储过程结合实现高效分页

    关键字:DataGrid.存储过程.分页 出自: http://blog.csdn.net/yzx110/archive/2004/08/18/78525.aspx 摘要:在最进的一个项目中因为一个管 ...

  5. ASP.NET中 DataGrid简单自定义分页

    先在pageload中添加事件         private void Page_Load(object sender, System.EventArgs e)         {          ...

  6. DataGrid实现自定义分页,鼠标移至变色,删除确认、可编辑,可删除

    先在数据库中定义存储过程,轻易实现百万级数据分页: //@PageSize:分页大小,PageIndex:页号,@PageCount:总页数,@recordCount:记录数 CREATE PROCE ...

  7. Asp.net中DataGrid控件的自定义分页

    使用实现起来虽然比较方便,但是效率不高,每次都需要读取所有页(整个记录集),而加载的只是其中一页,造成了资源的浪费,记录多又会使效率变得很低.下面通过DataGrid的自定义分页功能来减少资源使用和提 ...

  8. 艾伟_转载:VS 2010 和 .NET 4.0 系列之《在ASP.NET 4 Web Forms中实现URL导向》篇

    本系列文章导航 VS 2010 和 .NET 4.0 系列之<ASP.NET 4 中的SEO改进 >篇 VS 2010 和 .NET 4.0 系列之<干净的Web.Config文件 ...

  9. ASP.NET 2.0数据教程之二十六::排序自定义分页数据

    导言 和默认翻页方式相比,自定义分页能提高几个数量级的效率.当我们的需要对大量数据分页的时候就需要考虑自定义分页,然而实现自定义分页相比默认分页需要做更多工作.对于排序自定义分页数据也是这样,在本教程 ...

最新文章

  1. tf.contrib 的命运走向
  2. 水仙花数java_Java三种求水仙花数的方法
  3. 【不会吧不会吧,不会有人真的三分钟入门Python了吧?】Python编程基础
  4. 深入探究VC —— 链接器link.exe(4)【转】http://blog.csdn.net/wangningyu/article/details/4849452...
  5. access函数_ACCESS中的DLookUp函数是如何运算的?
  6. 联想gen系列服务器,Hpe Microserver Gen10 Plus开箱
  7. 数组中的第K个最大元素
  8. Cython 3.0 中文文档校对活动 | ApacheCN
  9. Spring 定时器结合线程池
  10. 虽然自己不是唱歌的材料
  11. [译]10-Spring BeanPostProcessor
  12. 磁盘类型 GetDriveType
  13. 基于SSH开发的校园一卡通管理系统
  14. 字符串str.format()方法
  15. vue图片查看器,支持放大 缩小 还原
  16. scp 保留文件属组_SCP命令用法详解-hdparm工具参数详解-改变文件组命令chgrp和改变文件属主命令chown_169IT.COM...
  17. html flash闹钟,教你用Flash制作可以定时闹钟
  18. uniapp自定义整包更新与热更新
  19. 基于android的网上点餐系统设计,基于Android的点餐系统设计与实现
  20. 数据库中decimal

热门文章

  1. BZOJ 2668: [cqoi2012]交换棋子
  2. linux命令 -- su
  3. 大家看看这个参数inctype你是否使用过?我做了以下测试,欢迎拍砖!
  4. skywalking告警相关配置
  5. python编写接口初识一
  6. 耿建超英语语法---被动语态
  7. CentOS 6上配置安装MariaDB,二进制文件,非源码
  8. ACM:动态规划,01背包问题
  9. CentOS7.2.1511 安装Mysql-5.7.13
  10. Keymob浅析2016网络营销十大趋势