在用戶端執行資料庫記錄的分頁顯示

來源:互聯網
上載者:User
分頁|用戶端|資料|資料庫|顯示|執行


緒論

  在ASP程式應用中經常有一個任務就是在一個分頁格式中顯示資料庫的查詢結果。比如,當處理大量的記錄內容時,應該一次只顯示10個項目,這樣就會使訪問者使用這些資訊更容易些。網路上已經有許多文章示範了多種對資料庫查詢結果進行分頁的方法,其中較好的文章包括:

  使用預存程序對資料庫記錄進行分頁

  資料庫分頁樣本代碼

  使用GetRows對記錄進行分頁

  但是所有這些文章介紹的方法都是在伺服器端進行分頁處理的。舉例來說,假如有30條資料庫記錄,我們希望一次顯示10條記錄。當使用者請求第一頁資料時,ASP頁面就提取前10條記錄並將它們發送給客戶。當使用者已經作好準備可以閱覽下面10條記錄時,他就點擊一個連結,這時ASP頁面就被重新裝載,通過查詢字串傳遞進來一個新的頁面值,ASP頁面將取出第11條到20條記錄,並將它們發給使用者。

  本文中我們將把這整個處理過程移植到用戶端。當使用者聯機查看資料時,這30個記錄將全部以用戶端JavaScript 數組的形式發送到客戶機上。另外,附加的用戶端JavaScript代碼負責顯示第1到第10條記錄,並且連結到後面或者前面的記錄集。當點擊這些連結時,將執行用戶端JavaScript代碼,新的資料會顯示出來。由於這些都是在用戶端發生的,因此只有在頁面第一次被裝載時才需要與Web伺服器聯絡,從而省卻伺服器與用戶端間的資料傳遞消耗,無疑大大地提高了應用程式的效能。

  所需要的用戶端指令碼

  要實現在用戶端顯示分頁的資料庫記錄,ASP頁面應該產生什麼樣的用戶端指令碼呢?如同前面所述,我們需要建立一個用戶端數組。因為我們準備在一個HTML表格中顯示資料庫記錄,那麼就要建立一個HTML數組,也許用它來顯示一個HTML TABLE行(<tr><td> Database Value </td></tr>)。這個數組中將包含所有我們希望允許使用者翻閱的資料庫元素。

  我們還需要一個用戶端的JavaScript函數以顯示這些數組值的子集。使用這個函數,我們可以顯示前N 個記錄;當使用者點擊一個連結時,就可以顯示後面(或前面) N個記錄。也就是說,這個函數負責用戶端分頁。

  最後,我們還需要一些方法在不更新頁面的情況下來動態改變一個HTML頁面的顯示。這可以通過DHTML(動態HTML)來實現。要實現這個目的,我們需要在堆積所有輸出的地方建立一個HTML DIV標記,然後使用用戶端JavaScript代碼在這個DIV標記中動態修改內容。關於使用DHTML的更多資訊,請閱讀動態HTML入門及跨瀏覽器DHTML教程.

建立一個分頁類

  要記住,這裡舉例的整個應用程式只包括一個ASP頁面。當這個ASP頁面被訪問時,它將建立執行記錄分頁需要的所有用戶端JavaScript代碼。為簡化這個過程,我建立了一個VBScript類來處理這個功能。使用這個類的時候,開發人員只需將他希望在訪問者的Web瀏覽器上進行分頁的記錄集傳遞進來即可。關於類的使用,請閱讀在VBScript中使用類。

  我將這個類命名為dhtmlGetRows,它包含兩個屬性和一個方法。兩個屬性是:

  1、 RecsPerPage:確定每一頁顯示多少個記錄。

  2、 THString:通過一個HTML表格顯示這個進行了分頁的結果;這個屬性允許你為表格的標題指定一個字串。

  單一的方法是GenerateHTML(RecordsetObject),它為分頁應用程式返回完整的HTML:用戶端JavaScript代碼和需要的DIV 標記。這個方法只需要一個參數RecordsetObject,它應該是一個記錄集對象,其中填充了你希望在一個分頁格式中顯示的資料庫資料。

  這個類的代碼相當長,並且大部分代碼都只是返回用戶端的JavaScript代碼。下面是類的代碼:

<%
Class dhtmlGetRows

'******* PRIVATE MEMBER VARIABLES **********
Private iRecsPerPage
Private strTHString
'*******************************************

'************ Initialize Event *************
Private Sub Class_Initialize()
iRecsPerPage = 10 'assign a default value
End Sub
'*******************************************


'************ PROPERTY LET/GET *************
Public Property Let THString(strValue)
'Replace all apostrophes with \'
strTHString = Replace(strValue, "'", "\'")
End Property

Public Property Get THString()
THString = strTHString
End Property


Public Property Let RecsPerPage(iValue)
If iValue > 0 and IsNumeric(iValue) then
iRecsPerPage = CInt(iValue)
End If
End Property

Public Property Get RecsPerPage()
RecsPerPage = iRecsPerPage
End Property
'*******************************************


'**************** METHODS ******************
Public Function GenerateHTML(objRS)

'Begin by getting an array of the data
Dim aValues
aValues = objRS.GetRows()

'Find the value of rows and columns
Dim iCols, iRows
iCols = UBound(aValues, 1)
iRows = UBound(aValues, 2)

Dim strOutput
'Display the initial script block
strOutput = "<script language=""javascript"">" & vbCrLf & _
"var tableRow = new Array(" & iRows & ");" & vbCrLf & vbCrLf

Dim iLoop, iColLoop, strTmp
For iLoop = 0 to iRows
strOutput = strOutput & "tableRow[" & iLoop & "] = '<tr>"

For iColLoop = 0 to iCols
'Fix apostrophes
strTmp = Replace(aValues(iColLoop, iLoop),"'", "\'")

'Remove carraige returns
strTmp = Replace(strTmp, vbCrLf, "")

strOutput = strOutput & "<td>" & strTmp & "</td>"
Next 'iColLoop

strOutput = strOutput & "</tr>';" & vbCrLf
Next 'iLoop

'Init global varaibles and find out what browser the user is using
strOutput = strOutput & vbCrLf & vbCrLf & "var first = 0;" & vbCrLf & _
"var last = " & iRecsPerPage & ";" & vbCrLf & _
"var mynav;" & vbCrLf & "if (navigator.appName == ""Netscape"")" & _
vbCrLf & vbTab & "mynav = ""NS"";" & vbCrLf & _
"if (navigator.appName == ""Microsoft Internet Explorer"")" & _
vbCrLf & vbTab & "mynav = ""IE"";" & vbCrLf & _
vbCrLf & "</script>" & vbCrLf & vbCrLf

'Now display the HTML table
strOutput = strOutput & vbCrLf & "<div id=""grid""> </div>" & vbCrLf & _
vbCrLf & vbCrLf & "<script language=""javascript"">" & vbCrLf


'Write the nav function
strOutput = strOutput & "function nav(iVal) {" & vbCrLf & _
"// do we want to move forward or backwards?" & vbCrLf & _
"if (iVal == 1) { " & vbCrLf & vbTab & "first += " & _
iRecsPerPage & ";" & vbCrLf & "last += " & iRecsPerPage & _
vbCrLf & "}" & vbCrLf & "else if (iVal == -1) { " & vbCrLf & vbTab & _
"first -= " & iRecsPerPage & ";" & vbCrLf & vbTab & "last -= " & _
iRecsPerPage & ";" & vbCrLf & "}" & vbCrLf & _
vbCrLf & vbCrLf & "var txt = '';" & vbCrLf & _
"txt += '<table border=""1"">';" & vbCrLf

'Do we need to add a TH string?
If Len(strTHString) > 0 then
strOutput = strOutput & "txt += '<tr>" & strTHString & "</tr>';" & vbCrLf
End If

strOutput = strOutput & "for (var iLoop = first; iLoop < last; iLoop++)" & vbCrLf & _
vbTab & "if (iLoop <= " & iRows & ") txt += tableRow[iLoop];" & vbCrLf & _
"txt += '</table>';" & vbCrLf & vbCrLf

'Now, show next/prev links if applicable
strOutput = strOutput & "if (first > 0) // show prev link" & vbCrLf & _
vbTab & "txt += '<a href=""javascript:nav(-1);"">Prev " & _
iRecsPerPage & "</a> ';" & vbCrLf & vbCrLf & _
"if (last <= " & iRows & ") // show next link" & vbCrLf & vbTab & _
"txt += '<a href=""javascript:nav(1);"">Next " & _
iRecsPerPage & "</a>';" & vbCrLf & vbCrLf

'Write out the new HTML content to the DIV tag
strOutput = strOutput & "// write out the the DIV tag depending on browser..." & vbCrLf & _
"if (mynav == ""NS"") {" & vbCrLf & vbTab & _
"document.layers['grid'].document.write(txt);" & vbCrLf & vbTab & _
"document.close();" & vbCrLf & "}" & vbCrLf & vbCrLf & _
"if (mynav == ""IE"")" & vbCrLf & vbTab & _
"document.all['grid'].innerHTML = txt;" & vbCrLf & vbCrLf & _
"}" & vbCrLf & vbCrLf

strOutput = strOutput & "nav(0);" & vbCrLf & "</script>"

GenerateHTML = strOutput
End Function
'*******************************************
End Class

%>

在結束之前,我想要快速地解釋一下怎樣在一個ASP頁面中使用這個類。由於這個類只包含一個方法,因此使用這個類相當簡單。你所需要做的就是建立並填充一個記錄集對象,然後建立一個類的例示,並使用Response.Write輸出objClassInstance.GenerateHTML(objRS)的值。

<!--#include file="dhtmlGetRows.class.asp"-->
<%
'Create and populate a Recordset
Dim objRS, objConn, strSQL
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "DSN=MyDSN"

strSQL = "SELECT TOP 25 ViewCount, Description " & _
"FROM tblFAQ ORDER BY ViewCount DESC"

Set objRS = objConn.Execute(strSQL)

'Create an instance of the dhtmlGetRows class
Dim objPagedResults
Set objPagedResults = new dhtmlGetRows

objPagedResults.THString = "<th>Views</th><th>FAQ Question</th>"
Response.Write objPagedResults.GenerateHTML(objRS)

'Clean up...
Set objPagedResults = Nothing

objRS.Close
Set objRS = Nothing

objConn.Close
Set objConn = Nothing
%>


   以上的程式碼片段假定dhtmlGetRows類可以在一個伺服器端包含檔案dhtmlGetRows.class.asp中使用。




相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。