DataList:
<%
'<class>
'<name>DataList</name>
'<description><![CDATA[数据列表;作者:圣诞菠萝包]]></description>
'<attributes>
' <attribute name="ID" comment="只写;数据列表ID"/>
' <attribute name="col" comment="只写;数据列表列数;当列数为1时,将以ul方式显示,否则以table方式显示;"/>
' <attribute name="ShowPageStyle" comment="只写;设置显示分页,当为False时,分页栏将不显示;默认值为True;"/>
' <attribute name="PageArg" comment="只写;分页参数;默认为CurrentPage"/>
' <attribute name="RecordCount" comment="只写;记录总数,分页显示时必须指定;"/>
' <attribute name="ItemTemplate" comment="只写;行模板;"/>
' <attribute name="AlternatingItemTemplate" comment="只写;交换行模板;"/>
' <attribute name="Style" comment="只写;数据列表样式"/>
' <attribute name="PageStyle" comment="只写;数据列表分页样式"/>
' <attribute name="DataSource" comment="只写;数据源"/>
'</attributes>
'<methods>
' <method name="DataBind()" comment="数据绑定,显示数据列表;"/>
'</methods>
'</class>
Class DataList
Private id_ '数据列表ID
Private pageSize_ '每页显示记录数
Private colNumber_ '列数
Private showPageStyle_ '是否允许分页
Private pageArg_ '分页参数
Private recordCount_ '记录总数
Private itemTemplate_ '行模板
Private alternatingItemTemplate_ '交换行模板
Private style_ 'DataList主体样式
Private pageStyle_ '分页样式
Private dataSource_ '数据源
'设置DataList的ID
Public Property Let ID(ByVal strID)
id_=strID
End Property
'设置列数
Public Property Let Col(ByVal intCol)
On Error Resume Next
intCol=Clng(intCol)
If Err.Number<>0 Or intCol<1 Then
Err.Clear()
colNumber_=1
Else
colNumber_=intCol
End If
End Property
'设置是否显示分页
Public Property Let ShowPageStyle(ByVal boolAllow)
If boolAllow<>False Then
showPageStyle_=True
Else
showPageStyle_=False
End If
End Property
'设置分页参数
Public Property Let PageArg(ByVal strArg)
If strArg<>"" Then
pageArg_=strArg
End If
End Property
'设置记录总数
Public Property Let RecordCount(ByVal intRecordCount)
recordCount_=intRecordCount
End Property
'设置行模板
Public Property Let ItemTemplate(ByVal strItemTemplate)
itemTemplate_=strItemTemplate
End Property
'设置交换行模板
Public Property Let AlternatingItemTemplate(ByVal strItemTemplate)
alternatingItemTemplate_=strItemTemplate
End Property
'设置样式
Public Property Let Style(ByVal strStyle)
style_=strStyle
End Property
'设置分页样式
Public Property Let PageStyle(ByVal strStyle)
pageStyle_=strStyle
End Property
'设置数据源
Public Property Let DataSource(ByRef objRS)
Set dataSource_=objRS
End Property
'数据绑定
Public Function DataBind()
Dim intRow
Response.Write("<!--数据列表:" & id_ & "开始-->" & VBCrlf)
If colNumber_=1 Then
'单列,用ul展示
Response.Write("<div id=""" & id_ & """ class=""" & style_ & """>" & VBCrlf)
Response.Write(" <ul>" & VBCrlf)
For intRow=0 To dataSource_.RecordCount-1
If alternatingItemTemplate_<>"" Then
If intRow mod 2 =0 Then
Response.Write(" " & ParserItemTemplate(itemTemplate_) & VBCrlf)
Else
Response.Write(" " & ParserAlternatingTemplate(alternatingItemTemplate_) & VBCrlf)
End If
Else
Response.Write(" " & ParserItemTemplate(itemTemplate_) & VBCrlf)
End If
dataSource_.MoveNext()
Next
Response.Write(" </ul>" & VBCrlf)
Response.Write("</div>" & VBCrlf)
Else
'多列,用表格展示
Response.Write("<table name=""" & id_ & """ id=""" & id_ & """ cellspacing=""0"" cellpadding=""0"" class=""" & style_ & """>" & VBCrlf)
Dim intCol
For intRow=0 To dataSource_.RecordCount-1
Response.Write(" <tr>" & VBCrlf)
For intCol=1 To colNumber_
Response.Write(" <td style=""width:" & int(100/colNumber_)& "%"">")
If alternatingItemTemplate_<>"" Then
If (intRow mod (colNumber_)*2 =0) Or Fix(intRow/colNumber_) mod 2 =0 Then
Response.Write(ParserItemTemplate(itemTemplate_))
Else
Response.Write(ParserAlternatingTemplate(alternatingItemTemplate_))
End If
Else
Response.Write(ParserItemTemplate(itemTemplate_))
End If
Response.Write("</td>" & VBCrlf)
If intCol<colNumber_ Then
intRow = intRow + 1
End If
dataSource_.MoveNext()
If dataSource_.EOF Then Exit For
Next
Response.Write(" </tr>" & VBCrlf)
If dataSource_.EOF Then Exit For
Next
Response.Write("</table>" & VBCrlf)
End If
Response.Write("<!--数据列表:" & id_ & "结束-->" & VBCrlf)
'显示分页
If showPageStyle_=True Then
Call CreatePageStyle()
End If
dataSource_.Close()
Set dataSource_=Nothing
End Function
Private arrItemTemplate,arrItemIndex '模板缓存数组,减少解析时间;
Private Function ParserItemTemplate(ByVal strItemTemplate)
ParserItemTemplate=ParseTemplate(strItemTemplate,arrItemTemplate,arrItemIndex)
End Function
Private arrAlternatingTemplate,arrAlternatingIndex '模板缓存数组,减少解析时间;
Private Function ParserAlternatingTemplate(ByVal strItemTemplate)
ParserAlternatingTemplate=ParseTemplate(strItemTemplate,arrAlternatingTemplate,arrAlternatingIndex)
End Function
'解析模板
Private Function ParseTemplate(ByVal strItemTemplate,ByRef arrTemplate,ByRef arrIndex)
If IsArray(arrTemplate) Then
For i=0 To UBound(arrTemplate)
If i<UBound(arrTemplate) Then
ParseTemplate=ParseTemplate & arrTemplate(i) & Eval(arrIndex(i))
Else
ParseTemplate=ParseTemplate & arrTemplate(i)
End If
Next
Exit Function
End If
Dim objRegExp,objMatches,strTemp,arrTemp,i,arrTempLen
Set objRegExp=new RegExp
objRegExp.Pattern = "{(\d+|(\d|,)+)}"
objRegExp.IgnoreCase = True
objRegExp.Global = True
strTemp=objRegExp.Replace(strItemTemplate,"{CHCW_SEPARATOR}")
arrTemp=Split(strTemp,"{CHCW_SEPARATOR}")
Set objMatches=objRegExp.Execute(strItemTemplate)
arrTempLen=UBound(arrTemp)
ReDim arrTemplate(arrTempLen)
ReDim arrIndex(arrTempLen-1)
For i=0 To arrTempLen
If i<arrTempLen Then
Dim objRegExpSub
Set objRegExpSub=new RegExp
objRegExpSub.Pattern="^(\d+),(\d+)$"
objRegExpSub.IgnoreCase = True
objRegExpSub.Global = True
If objRegExpSub.Test(objMatches(i).SubMatches(0)) Then
Dim objMatchesSub
Set objMatchesSub=objRegExpSub.Execute(objMatches(i).SubMatches(0))
ParseTemplate = ParseTemplate & arrTemp(i) & Left(dataSource_(Cint(objMatchesSub(0).SubMatches(0))),objMatchesSub(0).SubMatches(1))
arrIndex(i)="Left(dataSource_("&objMatchesSub(0).SubMatches(0)&"),"&objMatchesSub(0).SubMatches(1)&")"
Else
ParseTemplate = ParseTemplate & arrTemp(i) & dataSource_(Cint(objMatches(i).SubMatches(0)))
arrIndex(i)="dataSource_(" & objMatches(i).SubMatches(0) & ")"
End If
Set objMatchesSub=Nothing
Set objRegExpSub=Nothing
Else
ParseTemplate = ParseTemplate & arrTemp(i)
End If
arrTemplate(i) = arrTemp(i)
Next
Set objMatches=Nothing
Set objRegExp=Nothing
End Function
'过滤url参数
Private Function FilterUrlArgs()
Dim aArg
For each aArg In Request.QueryString
If StrComp(aArg,pageArg_,1)<>0 Then
FilterUrlArgs = FilterUrlArgs & "&" & aArg &"=" & Eval("Request.QueryString(aArg)")
End If
Next
End Function
'分页样式
Private Function CreatePageStyle()
On Error Resume Next
Dim intCurrentPage
intCurrentPage=Request.QueryString(pageArg_)
If intCurrentPage="" Or Not IsNumeric(intCurrentPage) Then
intCurrentPage=1
End If
intCurrentPage=Clng(intCurrentPage)
If intCurrentPage<1 Then
intCurrentPage=1
End If
If Err.Number<>0 Then
Err.Clear()
intCurrentPage=1
End If
If Application("CHCW_PageSize_" & id_ & "_" & Request.ServerVariables("SCRIPT_NAME"))="" Then
intCurrentPage=1
End If
If intCurrentPage=1 Then
Application.Lock()
Application("CHCW_PageSize_" & id_ & "_" & Request.ServerVariables("SCRIPT_NAME"))=dataSource_.RecordCount
Application.UnLock()
End If
Dim intPageCount
If recordCount_ mod Application("CHCW_PageSize_" & id_ & "_" & Request.ServerVariables("SCRIPT_NAME")) =0 Then
intPageCount=int(recordCount_/Application("CHCW_PageSize_" & id_ & "_" & Request.ServerVariables("SCRIPT_NAME")))
Else
intPageCount=int(recordCount_/Application("CHCW_PageSize_" & id_ & "_" & Request.ServerVariables("SCRIPT_NAME"))) + 1
End If
If intCurrentPage>intPageCount Then
intCurrentPage=intPageCount
End If
Response.Write("<!--数据列表:" & id_ & "分页样式开始-->" & VBCrlf)
Response.Write("<div id=""" & id_ & "_PageStyle"" class=""" & pageStyle_ & """><form action="""" method=""get"">")
Response.Write("共" & intCurrentPage & "/" & intPageCount & "页," & recordCount_ & "条记录 ")
If intCurrentPage>1 Then
Response.Write("<a href=""?" & pageArg_ & "=1" &FilterUrlArgs & """>首 页</a> ")
Response.Write("<a href=""?" & pageArg_ & "=" & intCurrentPage -1 & FilterUrlArgs & """>上一页</a> ")
Else
Response.Write("首 页 ")
Response.Write("上一页 ")
End If
Dim intPageIndex,i,intBeginNum,intEndNum
intBeginNum=1
intEndNum=1
intPageIndex=5
If intPageCount<intPageIndex Then
intBeginNum=1
intEndNum=intPageCount
Else
If intCurrentPage=<int(intPageIndex/2) Then
intBeginNum=1
intEndNum=intPageIndex
ElseIf intCurrentPage>intPageCount-int(intPageIndex/2) Then
intBeginNum=intCurrentPage-int(intPageIndex/2)*2
intEndNum=intPageCount
Else
intBeginNum=intCurrentPage-int(intPageIndex/2)
intEndNum=intCurrentPage+int(intPageIndex/2)
End If
End If
For i=intBeginNum To intEndNum
If i=intCurrentPage Then
Response.Write(" " & i & " ")
Else
Response.Write(" <a href=""?" & pageArg_ & "=" & i & FilterUrlArgs & """>" & i & "</a> ")
End If
Next
If intCurrentPage<intPageCount Then
Response.Write("<a href=""?" & pageArg_ & "=" & intCurrentPage+1 & FilterUrlArgs & """>下一页</a> ")
Response.Write("<a href=""?" & pageArg_ & "=" & intPageCount & FilterUrlArgs & """>尾 页</a> ")
Else
Response.Write("下一页 ")
Response.Write("尾 页 ")
End If
Response.Write("转到<input name=""" & pageArg_ & """ type=""text"" class=""inputText"" style=""width:30px;"" maxlength=""8"" />页" & VBCrlf)
Response.Write("</form></div>" & VBCrlf)
Response.Write("<!--数据列表:" & id_ & "分页样式结束-->")
End Function
'初始化
Private Sub Class_Initialize()
pageSize_=20
colNumber_=1
showPageStyle_=True
pageArg_="CurrentPage"
itemTemplate_="模板内容<br />"
alternatingItemTemplate_=""
id_="DataList1"
End Sub
'销毁
Private Sub Class_Terminate()
If Not dataSource_ Is Nothing Then
dataSource_.Close()
Set dataSource_=Nothing
End If
End Sub
End Class
%>
还有很多不足地方,灵活性还不够!不过大多情况也是适用的!
例子:
<!--#Include Virtual="/ASPLib/Util/Configuration.asp"-->
<!--#Include Virtual="/ASPLib/Util/DataAccess.asp"-->
<!--#include Virtual="/ASPLib/Control/DataList.asp"-->
<!--#include Virtual="/School/DAL/News.asp"-->
<%
Dim objDL
Set objDL=new DataList
objDL.ID="DataList1"
'objDL.PageArg="CurrentPage"
'objDL.ShowPageStyle=True
'objDL.Col=1
objDL.ItemTemplate="<li>·<a href=""news.asp?NewsID={0}"">{1,20}</a>({2})</li>" '{0}表示取得记录集Rs(0),{1,20}表示取得记录集Rs(1),并取得前20个字符;
objDL.AlternatingItemTemplate="<li style=""background:#F4F4F4;"">·<a href=""news.asp?NewsID={0}"">{1,20}</a>({2})</li>"
objDL.RecordCount=News.GetRecordNewsList(Keyword,NewsCategoryID) '调用News类的一个方法取得记录总数
objDL.DataSource=News.GetNewsList(PageSize,CurrentPage,Keyword,NewsCategoryID) '调用News类的方法取得记录集
objDL.DataBind()
Set objDL=Nothing
%>