[转】ASP.NET 数据分页第四篇 - WizardGridView 威力加强版
2012-11-02 15:46 时空印记 阅读(229) 评论(0) 编辑 收藏 举报本帖只是把前一篇帖子「ASP.NET 数据分页第三篇 - 结合 Custom Control 处理 GridView 的 UI 呈现」里面,提供给大家下载的 Custom Control,也就是加强「分页」功能的 GridView,再改写了一些细部功能。新功能如下:
* 这个 WizardGridView 所需要的 CSS、JavaScript,都已嵌入至 dll 里。如此一来,引用 WizardGridView 的页面即不必再引用外部的 CSS 档。
* 新增了 5 个「属性」,程序员可从 VS 2005/2008 的「属性」窗口,以图形界面直接做设定,如下图 1 右侧所示。
* 新增的「CustomFontSize」属性,可控制整个 GridView 里字体的大小 (预设为 Small),且不会受到引用页面中 HTML 设定的影响。
* 新增的属性中,有三个是开放让程序员自订「单数行、双数行、鼠标置于其上的资料行」的背景颜色。
* 加入了 icon 小图示。把 WizardGridView 加入 VS 2005/2008 的「工具箱」中时,会有我自订的小图示。
* 为了搭配一些用来制作 chm 文件的软件,加入了可让 Sandcastle 软件可辨识的批注文字。
* 有写过自订控件的人应知道,当一个 class 直接继承自微软原生的 GridView class,会造成引用的 ASPX 页面里,此自订 GridView 的 "Columns" tag 中的 IntelliSense 功能失效。因此我加入了 WizardTemplateField、WizardBoundField 两个 class,用来取代微软原生的 TemplateField、BoundField class。如此一来,当程序员在页面中引用WizardGridView 控件时,在 "Columns" tag 中的 IntelliSense 即又会生效。请参考下图 2。
图 1 新增的 5 个属性,已集中在 Visual Studio「属性」窗口的同一个 Index Tab 里
图 2 在 WizardGridView 的 "Columns" tag 中的 IntelliSense 仍会生效
本帖的示例代码下载点:
https://files.cnblogs.com/WizardWu/080928.zip
(执行本示例,需要 SQL Server 的 Northwind 数据库)
您只要直接以 VS 2005 开启「方案档 (.sln)」即可,里面的「WizardGridView」文件夹为 Custom Control 的 source code。用来 Demo 的网站范例有两个,一个是「SqlDataSource」文件夹,另一个是「ObjectDataSource」文件夹,前者会自动连结您本机的 SQL Server 2000/2005 的 Northwind 数据库,后者必须要您先在 SQL Server 2005 的 Northwind 里,先建立用来做「数据分页」的 Stored Procedure (亦附于本帖的下载代码里),才能正确连结您本机的 SQL Server 2005 的 Northwind 数据库。
本帖的下载代码里,所附的新版的「数据分页」Stored Procedure,加上了可处理 DISTINCT 需求的功能 (实际上是用 GROUP BY 取代 DISTINCT 去做处理)。在本系列的前两篇帖子「ASP.NET 数据分页第一篇 - 探讨分页原理及 SQL Server 2005 的 ROW_NUMBER 函数」、「ASP.NET 数据分页第二篇 - 范例下载」里曾提到,若我们没有用 Stored Procedure 去做「数据分页」的处理,当数据表中有一百万笔记录时,则 ASP.NET 默认的行为,是使用者每次单击页码换页时,都是一百万笔全部重新撷取,此举会造成系统内存大量浪费、performance 大大降低,甚至造成当机。
在本系列前几篇帖子里, 我们用来在 SQL Server 2005 中处理「数据分页」的 Stored Procedure,主要是用 SQL Server 2005 内建的一个 ROW_NUMBER 函数去做处理。但ROW_NUMBER 函数有一个缺点,就是会造成 DISTINCT 语句的功能失效;因此在本帖中的新版 Stored Procedure,是以 GROUP BY 取代 DISTINCT。在本帖下载代码的「ObejctDataSource」Demo 网站里,App_Code 文件夹里的 DAL 层、DAL2 层,也都会多传 一个 strGroupBy 参数,给这个专门用来做「数据分页」的 Stored Procedure。
<%@ Register Assembly="WizardGridView" Namespace="WizardGridView" TagPrefix="Wizard" %> <Wizard:WizardGridView ID="WizardGridView1" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="OrderID" DataSourceID="SqlDataSource1" WizardCustomPager="True"> <Columns> <asp:BoundField DataField="OrderID" HeaderText="OrderID" InsertVisible="False" ReadOnly="True" SortExpression="OrderID" /> <asp:BoundField DataField="CustomerID" HeaderText="CustomerID" SortExpression="CustomerID" /> <asp:BoundField DataField="OrderDate" HeaderText="OrderDate" SortExpression="OrderDate" /> <asp:BoundField DataField="ShipName" HeaderText="ShipName" SortExpression="ShipName" /> <asp:BoundField DataField="ShipCity" HeaderText="ShipCity" SortExpression="ShipCity" /> </Columns> </Wizard:WizardGridView> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnString_SqlClient %>" SelectCommand="SELECT [OrderID], [CustomerID], [OrderDate], [ShipName], [ShipCity] FROM [Orders]"> </asp:SqlDataSource> or with IntelliSense like this: <Wizard:WizardGridView ID="WizardGridView1" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="OrderID" DataSourceID="SqlDataSource1" WizardCustomPager="True"> <Columns> <asp:WizardBoundField DataField="OrderID" HeaderText="OrderID" InsertVisible="False" ReadOnly="True" SortExpression="OrderID" /> <asp:WizardTemplateField />
--------------转自 WizardWu:探讨分页原理及 SQL Server 2005 的 ROW_NUMBER 函数(四)