熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP中實現分頁顯示的七種武器

2013-11-13 10:39:42  來源: .NET編程 

  在微軟的ASP編程體系中ADO對象的建立使得從網頁訪問數據庫成為一件易事特別是ADO的Recordset對象使得控制數據的輸出顯示更為方便自由而在Visual InterDev(以下簡稱VI)中由於Script Object Model(以下簡稱SOM)DesignTime Control(以下簡稱DTC)以及Data Environment Object Model(以下簡稱DEOM)等對象模型的引入使網頁對數據庫的訪問設計顯得更為方便

  因為主題方面的原因關於數據庫的連接下文只給出代碼和簡要注釋而把重點放在如何利用Recordset對象(或控件)實現數據記錄的分頁顯示方面根據我的理解分頁顯示的關鍵就在於對ADO的Recordset對象或DTC(設計時控件)的Recordset控件的屬性和方法的熟練把握上

  這七種分頁顯示的武器概括起來說分四類

  第一二種我暫取名叫“純ASP法”這也是國內的ASP網站上用得最多的方法它們的區別僅在實現技巧的不同這兩種方法的實現最易理解用到的對象概念也最少對開發環境的要求也最低(只要記事本就行)可以說這兩種方法的實質還是CGI的編程思想只是在程序中引入了ADO對象而已

  第四五種暫取名叫“SOM的DHTML法”這兩種方法要求在VI的環境下利用微軟提出的腳本對象模型(Script Object Model)和DHTML中Table對象的與數據庫綁定的新特性(許多書和文章只介紹了DHTML的CSS特性在樣式設計中的運用而忽略介紹其數據綁定特性)實現在客戶端控制翻頁但它要求用戶的浏覽器必須是支持DHTMLMicrosoft Internet Explorer 及以上的版本

  第六種暫取名叫“SOM服務器端法”要求在VI的環境下開發它利用微軟提出的腳本對象模型(Script Object Model)中的幾個DTC控件RecordsetPageObjectGrid等在服務器端(客戶端)實現翻頁控制這是一種激動人心的全新的編程方法它把網頁看成對象(這種對象模型和傳統的DOMdocument object model是有區別的DOM只能控制客戶端而SOM可控制服務器端和客戶端)它真正實現了網頁的面向對象編程但遺憾的是也許是我個人能力有限這種技術我個人認為還不是很成熟比如與浏覽器的結合還不是很好這將在後文詳細說明

  第七種暫取名叫“DEOM法”它也是利用了VI中建立的數據環境對象模型(Data Environment Object Model)建立Recordset對象這也是在網頁編程上比較少見的新方法與SOM模型相比自有它的優點這將在後文詳述

  在後面所舉的所有例子源代碼都可以直接拷貝使用你甚至可以不懂其原理只要把其中的粗斜體字部分換成相應自己的數據庫名或字段名就可以了

  在開始詳細介紹各種分頁方法前讓我們先創建一個數據庫用Office中的access自創一個Employeemdb其中建一個表emp只設三個字段emp IDlast name和first name為什麼這麼簡單是因為我們關心的是怎樣處理recordset的結果

  第一種參數直接代入法

  這種方法是用手工建立Recordset對象利用其pagesize(每頁指定顯示記錄數)pagecount(總頁碼數)和absolutepage(當前頁碼數)屬性來控制分頁的輸出分頁采用<href>直接帶頁碼參數的方法來控制翻頁網頁的名字為empasp源代碼如下

<%//建立與employeemdb數據庫的連接
Set conn = ServerCreateObject("ADODBConnection")
connOpen "driver={Microsoft Access Driver (*mdb)};dbq=employeemdb"
//建立emp表的Recordset對象實例rs
Set rs = ServerCreateObject("ADODBRecordset")
rsOpen "emp" conn

PageSize = //pagesize屬性指定了每頁要顯示的記錄條數
Page = CLng(Request("Page")) ’string型轉化為long型
If Page < Then Page =
If Page > rsPageCount Then Page = rsPageCount
If Page <> Then
 ResponseWrite "<A HREF=empasp?Page=>第一頁</A>"
 ResponseWrite "<A HREF=empasp?Page=" & (Page) & ">上一頁</A>"
End If
If Page <> rsPageCount Then
 ResponseWrite "<A HREF=empasp?Page=" & (Page+) & ">下一頁</A>"
 ResponseWrite "<A HREF=empasp?Page="&rsPageCount & ">最後一頁</A>"
End If
Responsewrite"頁碼" & Page & "/" & rsPageCount & "</font>"
//每一頁的顯示
//顯示表頭
ResponseWrite "<CENTER><TABLE BORDER=>"
ResponseWRITE "<TR><TD>" & rsFields("emp ID")Name & "</TD>"
ResponseWRITE "<TD>" & rsFields("last name")Name & "</TD>"
ResponseWRITE "<TD>" & rsFields("first name")Name & "</TD></TR>"
//循環顯示每條記錄
rsAbsolutePage = Page //把頁碼賦給absolutepage屬性從而知當前頁的首條記錄號
For iPage = To rsPageSize //
ResponseWRITE "<TR><TD>" & rsFields("emp ID")Value & "</TD>"
ResponseWRITE "<TD>" & rsFields("first name")Value & "</TD>"
ResponseWRITE "<TD>" & rsFields("last name")Value & "</TD></TR>"
rsMoveNext
If rsEOF Then Exit For
Next
ResponseWrite "</TABLE></CENTER>"%>
  第二種表單傳送參數法

  這種方法在創建Recordset對象時與第一種相同只是在翻頁控制時采用<input>和case語句配合來實現翻頁網頁的名字為:empasp此方法在編程邏輯上有個缺點就是在按過“上頁”或“下頁”鈕後再在浏覽器上按刷新按鈕時會自動翻頁源代碼如下

if Pagenum = "" Then Pagenum = //從第一頁開始顯示
//建立數據庫連接和Recordset對象實例rs
與第一種方法相同此處略過

RSPagesize = ’ 設置一頁中顯示的記錄條數為
// 確定翻頁的動作
Select Case Request("NAV")
Case ""
 session("Pagenum") =
case "First" ’ First Record
 session("Pagenum") =
case "Prev" ’ Previous Record
 if session("Pagenum") > then
  session("Pagenum") = session("Pagenum")
 End If
case "Next" ’ Next Record
 if session("Pagenum")< RSPageCount then
  session("Pagenum") = session("Pagenum") +
 End if
case "Last" ’ Last Record
 session("Pagenum") = RSPageCount
End Select
RSAbsolutepage = Clng(session("Pagenum")) //確定當前頁的第一條記錄號
// 顯示當前頁
同第一種方法此處略過
// Nav 翻頁按鈕設置
<form method="GET" action="empasp">
<input type="submit" name="NAV" Value="首頁">
<input type="submit" value="上頁" name="NAV">
<input type="submit" value="下頁" name="NAV">
<input type="submit" value="末頁" name="NAV"></form>
  第三種用Grid控件設計分頁

  所有的方法中這種方法最容易你只需拖DTC中的Recordset控件和Grid控件到asp網頁中就行了而且你還能選擇是在服務器平台還是在客戶端平台控制翻頁缺點就是你必須用它給定的格式顯示而不能自己自由控制表格的顯示格式

  方法如下

  在VI中建一個工程empvip再在工程中添加一個asp網頁empasp

  第一步選VI菜單條上的“add data connect…”按開發工具的導航提示你就可以很容易地建立與Employeemdb數據庫的連接從DTC工具欄中拖一個Recordset控件到網頁中並設置其屬性具體如圖

  當你拖控件到網頁中時VI會自動提示你“是否使用Scripting object model”按yes

  第三步從DTC工具欄中拖一個Grid控件到網頁中然後單擊鼠標右鍵設置其屬性選在第二步中創建的Recordset控件名選擇emp表中的字段每頁顯示多少條記錄以及顯示格式等非常簡單方便只要照著導航提示做就行了

  第四種DHTML法一

  數據記錄顯示在一個HTML表中它利用DHTML中表的數據綁定特性來控制記錄的分頁顯示缺點就是你的翻頁方法將被限制為一種特定的方式只能“上頁”和“下頁”而不能“首頁”和“末頁”由於是在客戶端控制翻頁所以這種和第五種方法是速度最快的但遺憾的是它只能在支持DHTML的浏覽器上使用

  在DHTML中<TABLE>的DATASRC屬性可使表格綁定到一個數據源另一個屬性DATAPAGESIZE可指定一頁一次顯示的記錄數

  我們來看下面的例子

  第一步拖Recordset控件到新建的網頁emphtm中設置其屬性方法同第三種此處略

  第二步輸入下面的代碼

<TABLE ID="Table" DATASRC="#Recordset_RDS" DATAPAGESIZE=> //假定前面設定Recordset控件名為Recordset每頁顯示條記錄
<THEAD>
<TH ALIGN="left" WIDTH=>Emp ID</TH> //輸出表頭
<TH ALIGN="left" WIDTH=>Last Name</TH>
<TH ALIGN="left" WIDTH=>First Name</TH>
</THEAD>
<TR>
<TD><DIV DATAFLD="Emp ID"></DIV></TD> //輸出表內容
<TD><DIV DATAFLD="Last Name"></DIV></TD>
<TD><DIV DATAFLD="First Name"></DIV></TD>
</TR>
</TABLE>
  第三步然後增加一對DTCs Button按鈕控件來做翻頁導航一個命名為“btnPrevious”(上一頁)一個命名為“btnNext”(下一頁)它們相應的腳本如下

<SCRIPT LANGUAGE=VBScript>
Function btnPrevious_onclick()
TablepreviousPage()
End Function

Function btnNext_onclick()
TablenextPage()
End Function
</SCRIPT>
  第五種DHTML法二

  這種方法是對第四種方法的完善采用手工編寫腳本的方法使我們能做“首頁”“末頁”翻頁導航按鈕並能確定每條記錄的位置(記錄號)由於篇幅的關系我在下面只介紹一個具體例子並給出簡要說明其它關於DHTML和Recordset控件的一些屬性和方法請讀者自行參照相關書籍這裡需要提請注意的是Recordset控件與第一二種方法中介紹的ADO的Recordset對象有些不同Recordset控件沒有直接給出pagesize和pagecount等屬性需要用下面介紹的方法來計算

  第一步拖Recordset控件到新建的網頁emphtm中名字為Recordset設置其屬性方法同第三種此處略

  第二步定義三個全局變量和編寫Recordset的ondatasetcomplete(數據設置完成時)腳本

Dim gCurrentPageNumber //當前頁號
Dim gMaxPageNumber //最大頁數
Dim gRecordsPerPage //每頁顯示記錄數
gRecordsPerPage = // 設置每頁顯示記錄數為條記錄

Function Recordset_ondatasetcomplete()
totalRecordCount = RecordsetgetCount() //總的記錄條數
gMaxPageNumber = Int(totalRecordCount / gRecordsPerPage) //獲得最大頁數
If (totalRecordCount Mod gRecordsPerPage) > then
gMaxPageNumber = gMaxPageNumber +
End If
End Function
  第三步創建翻頁導航按鈕

Function btnFirst_onclick() ’ 翻到首頁
 gCurrentPageNumber =
 DisplayData()
End Function

Function btnPrevious_onclick() ’ 翻到上一頁
 if gCurrentPageNumber > Then
  gCurrentPageNumber = gCurrentPageNumber
  DisplayData()
 End If
End Function

Function btnNext_onclick() ’ 翻到下一頁
 if gCurrentPageNumber < gMaxPageNumber Then
  gCurrentPageNumber = gCurrentPageNumber +
  DisplayData()
 End If
End Function

Function btnLast_onclick() ’翻到末頁
 gCurrentPageNumber = gMaxPageNumber
 DisplayData()
End Function
  第四步編寫顯示每一頁的函數其中使用了許多DHTML的屬性和方法請讀者自行參考相關書籍

Sub DisplayData()
startRecord = ((gCurrentPageNumber ) * gRecordsPerPage) + //計算每一頁開始顯示的記錄號數(位置第幾條)
rowCtr =
lblPageNumberinnerHTML = gCurrentPageNumber & "/" & gMaxPageNumber
For recordPtr = startRecord To (startRecord + gRecordsPerPage ) //循環顯示一頁的各條記錄
 If recordPtr > RecordsetgetCount() Then //顯示空表
  Tablerows(rowCtr)cells()innerHTML = "<P> </P>"
  Tablerows(rowCtr)cells()innerHTML = "<P> </P>"
  Tablerows(rowCtr)cells()innerHTML = "<P> </P>"
  Tablerows(rowCtr)cells()innerHTML = "<P> </P>"
 Else //具體顯示每一頁
  RecordsetmoveAbsolute(recordPtr) //移動記錄指針
  empID = RecordsetfieldsgetValue("emp ID")
  empLName = RecordsetfieldsgetValue("first name")
  empFName = RecordsetfieldsgetValue("last name")

  Tablerows(rowCtr)cells()innerText = recordPtr ’ Counter
  Tablerows(rowCtr)cells()innerText = empID
  Tablerows(rowCtr)cells()innerText = empLName
  Tablerows(rowCtr)cells()innerText = empFName
 End If
 rowCtr = rowCtr +
Next
End Sub
  另外我們還需要在window對象的onload事件中編寫如下腳本

For rowCtr = to gRecordsPerPage
 TableinsertRow(rowCtr) ’ 插一新列
 For cellCtr = to
  Tablerows(rowCtr)insertCell()
 Next
Next
  第六種服務器端控制翻頁方法

  如果我們在服務器端對數據進行分頁形成HTML語句後再輸出到客戶端就不會存在浏覽器不支持DHTML的問題了可是用服務器端法使得我們每次翻頁時都得讓Recordset控件重新產生一次因此速度肯定要比用DHTML的方法慢但如果服務器足夠快的話這點慢客戶是察覺不到的

  下面的例子中我將介紹一個新的DTC控件PageObject這個控件使被指定的網頁成為一個網頁對象用戶在此網頁的服務器腳本中組織的子程序和函數可被看作是該網頁對象的方法它提供了管理狀態信息的一種先進的方法網頁對象有一些屬性(變量)用戶可以定義這些屬性的生存期因為以上這些特性使我們在編制翻頁的腳本時非常方便

  但這種方法的缺點是當你按了“上頁”或“下頁”按鈕後再浏覽器上的按刷新按鈕網頁會自動翻頁另外如果按了浏覽器上的“回退”按鈕後再按翻頁按鈕可能會出現一次亂翻這都是因為網頁對象屬性(全局變量)造成的

  第一步拖Recordset控件到新建的網頁empasp中名字為Recordset設置其屬性方法同第三種此處略

  第二步拖PageObject控件到網頁中取名叫emplist然後右鍵單擊此控件打開屬性頁並設置MaxPageNumberRecordsPerPageCurrrentPageNumber三個屬性(全局變量)VI可用get和set方法來讀寫它們的值具體用法請查閱相關資料

  第三步編寫Recordset的ondatasetcomplete事件

Function Recordset_ondatasetcomplete()
recordsPerPage =
empListsetRecordsPerPage(recordsPerPage)//設置網頁對象每頁記錄條數屬性為
totalRecordCount = RecordsetgetCount()//獲得記錄集的總條數
mpn = Int(totalRecordCount / recordsPerPage) //計算出mpn為總頁數
If (totalRecordCount Mod recordsPerPage) > then
mpn = mpn +
End If
empListsetMaxPageNumber(mpn)
End Function
  第四步拖四個button控件到網頁中編寫翻頁控制腳本我們主要是通過改變網頁對象的CurrentPageNumber屬性的值來實現翻頁

Function btnFirst_onclick()’ 翻到首頁
 empListsetCurrentPageNumber()
End Function

Function btnPrevious_onclick()’ 翻到上一頁
 cpn = empListgetCurrentPageNumber()
 if cpn > Then
  empListsetCurrentPageNumber(cpn )
 End If
End Function

Function btnNext_onclick()’ 翻到下一頁
 cpn = empListgetCurrentPageNumber()
 if cpn < empListgetMaxPageNumber() then
  empListsetCurrentPageNumber(cpn + )
 End If
End Function

Function btnLast_onclick() ’ 翻到末頁
 empListsetCurrentPageNumber( empListgetMaxPageNumber() )
End Function
  為保證首次進入該頁時顯示的是第一頁我們還得編寫該網頁對象的onEnter事件

Function empList_onEnter()
 If empListfirstEntered Then
  empListsetCurrentPageNumber()
 End If
End Function
  第五步編寫顯示每一頁的腳本

<HR><TABLE BORDER=><TR>//顯示表頭
<TH ALIGN="left" WIDTH=></TH>
<TH ALIGN="left" WIDTH=>Emp ID</TH>
<TH ALIGN="left" WIDTH=>Last Name</TH>
<TH ALIGN="left" WIDTH=>First Name</TH></TR>
<%
pageNumber = empListgetCurrentPageNumber()//計算翻頁所需的各種參數同DHTML法二
recordsPerPage = empListgetRecordsPerPage()
startRecord = ((pageNumber ) * recordsPerPage) +
lastRecord = RecordsetgetCount()
For recordPtr = startRecord To (startRecord + recordsPerPage )%>
<%If RecordsetEOF = True Then%>
<TR>
<TD> </TD>
<TD> </TD>
<TD> </TD>
<TD> </TD>
</TR>
<%Else%>
<%RecordsetmoveAbsolute(recordPtr)%>
<TR>
<% If recordPtr <= lastRecord Then %>
<TD><%=recordptr%></TD>
<%Else%>
<TD> </TD>
<% End If %>
<TD><%=RecordsetfieldsgetValue("emp ID")%></TD>
<TD><%=RecordsetfieldsgetValue("last name")%></TD>
<TD><%=RecordsetfieldsgetValue("first name")%></TD>
</TR>
<%End If%>
<%Next%>
</TABLE><HR>
  第七種Data Environment Object Model(數據環境對象模型)法

  Data Environment對象模型把ADO對象模型及它的對象“Connection”“Command”“Recordset”“Field”以及“Parameter”對象抽象到一個更加容易的表單中Data Environment Object Model把命令顯露為方法用戶可以調用這些方法這些方法會執行這些命令並返回所得到的記錄集關於DEOM對象模型詳細資料請參考相關書籍我們來看下面網頁empasp的例子

  第一步在VI的“project Explorer”窗口中的工程項目上右擊鼠標並從彈出式菜單選擇“Add Data Connection”根據VI給出的導航提示建立一個到數據庫的連接之後用戶就添加了一個實現從ASP應用程序訪問數據庫的數據命令同時你將會在“Project Explorer”窗口中的globalasa文件下方看到一個“Data Environment”對象

  第二步右擊“Data Environment”對象然後從彈出式菜單中選擇“Add Data Command”選項添加一個數據命令Command根據VI的導航提示你可以在Command Properties彈出窗口的Genetal頁中選SQL Statement輸入select * from emp按OK返回

  第三步你創建了這個數據命令後就已經為該Data Environment對象創建了一個方法然後就可以從腳本中調用這個方法而且該方法將會給用戶返回一個記錄集

thisPagecreateDE() //在SOM模式下thisPage表示當前網頁對象createDE()方法創建了DE對象
DECommand//執行DE對象的命令後面可代參數做有條件查詢時很有用
Set rs=DErsCommand//DErscommand使得rs對象完全等同於一個ADO的Recordset對象
  第四步因為rs為ADO對象所以以下的實現翻頁代碼完全參照以上介紹的幾種方法此處略過

  其它還有如FrontPage的數據庫導航中實現的方法等因與本主題無關此處略

  綜上所述前面介紹的每種方法都包含了很多新的技術由於篇幅的關系無法深入本文只是想通過實現翻頁這一具體的例子來介紹ASP網頁編程的多種方法讓大家親身體驗一下VI在編制網頁中的強大功能了解和熟悉微軟在網頁編程中提出的ADODHTMLDTC控件SOM對象模型和DEOM對象模型的使用方法希望能給大家在編制網頁時提供更多的選擇和參考


From:http://tw.wingwit.com/Article/program/net/201311/14246.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.