[Transfer][VB]DataGrid分页机制,通过编程做一个十分有个性、功能十分完善的分页效果

我们来分析DataGrid控件的分页功能在以上两个实例中应用。通过分析代码我们知道:当客户端请求翻页时候,ASP.NET将执行由.NET框架委托的同名事件――PageIndexChanged事件,通过这个事件过程达到分页目的。分页机制主要体现在上段的DataGrid1.CurrentPageIndex = e.NewPageIndex语句中。在利用OleDbDataAdapter 对象读取数据后,往DataSet对象中填充数据的就是CurrentPageIndex和PageSize两个属性。OleDbDataAdapter从数据库中按照一定的记录排序方式读出数据后,把从第(CurrentPageIndex*PageSize)条记录开始到第(CurrentPageIndex*PageSize+PageSize)条记录填充到DataSet里,组成一个满页的记录,然后在绑定到DataGrid,然后通过DataGrid控件显示出来,就是请求的页面。本质上就是利用DataAdapter对象Fill方法的几个重载。但是这个过程对于使用这种分页方式的用户来说是透明的,因此我们无需编写任何代码,一切由.NET框架运行库完成。这样的好处是并不需要多少编程技巧,只需指指点点,分页效果就实现了。不好的地方就是缺少灵活性。当我们需要一个多样化,个性化的分页效果的时候,我们就要利用简单编程的方式来实现。



下面这个实例中,我们将可以根据DataGrid分页机制,通过编程做一个十分有个性、功能十分完善的分页效果。

 

在DataCon Web项目里新建一个Web 窗体,命名为DataGrid_Sample3.aspx,并添加一个DataGrid控件,四个LinkButton控件,一个DropDownList控件,一个Label1控件,一个TextBox控件,一个Button控件,一个正规则表达式验证控件。
DataGrid_Sample3.aspx的主要HTML代码如下:

 1<form id="Form1" method="post" runat="server">
 2 <FONT face="宋体">
 3 <asp:DataGrid 
 4       id="DataGrid1" 
 5        runat="server" Width="368px" Height="144px" AllowPaging="True" AllowCustomPaging="True"
 6  PageSize="999">
 7  <ItemStyle Font-Size="X-Small"></ItemStyle>
 8  <HeaderStyle BackColor="SkyBlue"></HeaderStyle>
 9 <PagerStyle Visible="False" PageButtonCount="5" Mode="NumericPages"></PagerStyle>
10 </asp:DataGrid><br>
11 <asp:LinkButton    
12id="LinkButton1" runat="server"
13 Font-Size="X-Small">第一页</asp:LinkButton>  
14    <asp:LinkButton 
15id="LinkButton2" runat="server"
16 Font-Size="X-Small">上一页</asp:LinkButton>
17 <asp:LinkButton 
18id="LinkButton3" runat="server" 
19Font-Size="X-Small">下一页</asp:LinkButton>
20 <asp:LinkButton 
21id="LinkButton4" runat="server" 
22Font-Size="X-Small">最后页</asp:LinkButton>
23 <asp:Label 
24id="Label1" runat="server" Width="168px" 
25Font-Size="X-Small">Label</asp:Label>
26 <br>
27  每页记录条数
28 <asp:DropDownList
29 id="DropDownList1" runat="server" 
30Height="32px" Width="48px" AutoPostBack="True">
31  <asp:ListItem value="3">3</asp:ListItem>
32  <asp:ListItem value="5">5</asp:ListItem>
33  <asp:ListItem value="7" Selected="True">7</asp:ListItem>
34  <asp:ListItem value="9">9</asp:ListItem>
35  <asp:ListItem value="12">12</asp:ListItem>
36  <asp:ListItem value="15">15</asp:ListItem>
37 </asp:DropDownList>
38    跳转至
39 <asp:TextBox 
40id="TextBox1" runat="server" Width="48px"></asp:TextBox>
41 <asp:Button id="Button1" runat="server" 
42Width="40px" Text="->Go"></asp:Button>
43 <asp:RegularExpressionValidator 
44id="RegularExpressionValidator1" runat="server" 
45Font-Size="XX-Small" ErrorMessage="请输入正确的页码"
46     ValidationExpression="[1-9]{1}\d{0,}" 
47ControlToValidate="TextBox1" >
48</asp:RegularExpressionValidator>
49</FONT>
50</form>
51
52http://www.sucsky.com/info/8120.htm
53


DataGrid_Sample3.aspx.vb的代码如下:

'----code begin----

  1'引入名称空间
  2Imports System
  3Imports System.Data
  4Imports System.Web.UI
  5Public Class DataGrid_Sample3_aspx
  6    Inherits System.Web.UI.Page
  7Web 窗体设计器生成的代码
 10 Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 11        '在此处放置初始化页的用户代码
 12        If Not IsPostBack Then
 13            viewstate("startpage"= 0
 14            '利用viewstate("startpage")来保存DataGrid1当前页码索引
 15            '初始化为0,即第一页
 16            viewstate("PageSize"= 7
 17            'viewstate("PageSize")来保存PageSize,初始化为7
 18        End If
 19        getdata() '条用分页过程
 20End Sub
 21    '编写读取数据通用过程,利用该过程读出数据,根据指定数据进行分页,
 22    '并绑定到DataGrid控件上
 23    Sub getdata()
 24        Dim connstr As String  '声明数据库连接字符
 25        Dim mycon As OleDb.OleDbConnection
 26        '因为使用Aeecss数据库,所以声明OleDConnention对象
 27        Dim mycmd As OleDb.OleDbDataAdapter
 28        '声明DataAdapter对象
 29        Dim mysql As String
 30        '声明Command命令的 SQL字符串
 31        Try
 32            connstr = "provider=microsoft.jet.oledb.4.0;data source=" + Server.MapPath("."+ "\StudentInfor.mdb"
 33            '为连接字符串赋值
 34            mycon = New OleDb.OleDbConnection(connstr)
 35            '实例化Connection对象
 36            mysql = "Select id,name,sex,class,tel ,email from student"
 37            '设置SQL语句,即查询数据库中所有内容
 38            mycmd = New OleDb.OleDbDataAdapter(mysql, mycon)
 39            Dim dt As Data.DataSet = New Data.DataSet
 40            '声明DataSet对象,并实例话
 41            mycmd.Fill(dt, viewstate("startpage"* viewstate("PageSize"), viewstate("PageSize"), "infor")
 42            '填充数据,即在内存中生成DataSet模型数据库
 43            '利用DataAdapter.Fill的重载功能, viewstate("startpage") * viewstate("PageSize")乘机结果是第几条记录
 44            DataGrid1.DataSource = dt.Tables("infor")
 45            '为DataGrid1控件指定数据源
 46            DataGrid1.DataBind()
 47            '执行绑定
 48        Catch ex As Exception
 49            Response.Write("程序出错,信息描述如下:<br>" & ex.Message)
 50        Finally
 51            mycon.Close()
 52        End Try
 53        getpages()
 54End Sub
 55    '获取记录分页信息
 56    Sub getpages()
 57        Dim mycon As OleDb.OleDbConnection = New OleDb.OleDbConnection(" provider=microsoft.jet.oledb.4.0;data source=" & Server.MapPath("."& "\StudentInfor.mdb")
 58        mycon.Open()
 59        Try
 60            Dim mycmd As OleDb.OleDbCommand = New OleDb.OleDbCommand("select count(*) from student", mycon)
 61            viewstate("pc"= mycmd.ExecuteScalar \ viewstate("PageSize"+ 1
 62            Label1.Text = "当前为第[" & (viewstate("startpage"+ 1).ToString & "]页/共[" & (viewstate("pc")) & "]页"
 63        Catch ex As Exception
 64            Response.Write("程序出错,信息描述如下:<br>" & ex.Message)
 65        Finally
 66            mycon.Close()
 67        End Try
 68End Sub
 69    '跳转至第一页
 70 Private Sub LinkButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LinkButton1.Click
 71        If viewstate("startpage"<> 0 Then
 72            '如果当前页面不是第一页则执行
 73            viewstate("startpage"= 0
 74        End If
 75        getdata()
 76End Sub
 77    '跳转至上一页 ,即页码减1
 78 Private Sub LinkButton2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LinkButton2.Click
 79        If viewstate("startpage"> 0 Then
 80            '如果当前页码索引大于0则执行
 81            viewstate("startpage"= viewstate("startpage"- 1
 82        End If
 83        getdata()
 84End Sub
 85    '跳转至下一页 ,即页码加1
 86 Private Sub LinkButton3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LinkButton3.Click
 87        If viewstate("startpage"< viewstate("pc"- 1 Then
 88            '如果当前页码索引小于(总页数-1)时 则执行
 89            viewstate("startpage"= viewstate("startpage"+ 1
 90        End If
 91        getdata()
 92End Sub
 93    ' 跳转至最后一页
 94 Private Sub LinkButton4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LinkButton4.Click
 95        If viewstate("startpage"<> viewstate("pc"- 1 Then
 96            '如果当前页面不是最后一页则执行
 97            viewstate("startpage"= viewstate("pc"- 1
 98        End If
 99        getdata()
100End Sub
101    '跳转至选中页码
102 Private Sub DropDownList1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DropDownList1.SelectedIndexChanged
103        viewstate("PageSize"= DropDownList1.Selectedvalue
104        viewstate("startpage"= 0
105        getdata()
106End Sub
107    '跳转至手工输入的代码页码
108 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
109        If Int(TextBox1.Text) <= viewstate("pc"Then
110            viewstate("startpage"= Int(TextBox1.Text) - 1
111            getdata()
112        End If
113End Sub
114End Class
115'-----code end ----------
116

posted @ 2007-02-24 22:24  布袋  阅读(2392)  评论(0编辑  收藏  举报