用ASP创建多栏选项列表(2)
发表于:2007-06-30来源:作者:点击数:
标签:
strUA = Request.ServerVariables("HTTP_USER_AGENT") If Instr(strUA, "MSIE") Then browserType = "IE" End If 接下来是对 数据库 进行调用,以恢复我们创建多栏列表时所想要使用的记录集。变量rsSelect 包含返回的设定结果。我是通过一个DCOM 对象spServe
strUA = Request.ServerVariables("HTTP_USER_AGENT")
If Instr(strUA, "MSIE") Then
browserType = "IE"
End If
接下来是对
数据库进行调用,以恢复我们创建多栏列表时所想要使用的记录集。变量rsSelect 包含返回的设定结果。我是通过一个DCOM 对象spServerObj来实现对数据库的调用的,在数组中传递 参数及其值。但是通过ASP用ADO进行调用也同样简单,在这个例子中用一个简单的选择语句来恢复记录集。
Set rsSelect = spServerObj.callAnyProc(proc, parmname, parmval)
或者象在例子中那样:
Set rsSelect = MyConn.Execute(
SQL_query)
然后,我们调整用来容纳多选项列表的栏名的值的数组的维数。你可以在开始时就定义好它的维数,但是我们按照讨论的流程,在这里设定数组的维数。所以,在column参数中传递的元素数就是在 多栏选项列表中的栏数。
Redim finalMaxLenArray(UBound(column))
第一个主要代码区是收集格式信息以正确地创建选项列表。代码区实质上做两件事。首先,它确定我们的最大栏宽。第二,代码要将找到的最大栏宽与maxcollen 参数中传递的任意值进行协调。
与我的例子正相反,你可能希望明确地设置栏宽,而不是在运行的过程中确定最大宽度。代码区的第一半在记录集中循环,找到最大值长度,并将它存储在相应的finalMaxLenArray 索引中。
有一件事需要指出的是你可以将Do?/CODE > 循环安排在外面,For Next循环在里面。这样的方法也许更有效,但是我觉得这样不符合直觉,所以我就没有改动代码。
'Loop for formatting the select list values
For i = 0 to UBound(column)
maxStrLenTemp = 0
finalMaxLenArray(i) = 0
' Loop through recordset to determine the maximum length string
' in given column
If Not rsSelect.BOF Then rsSelect.MoveFirst
Do While Not rsSelect.EOF
maxStrLenTemp = Len(Trim(rsSelect(CStr(Trim(column(i))))))
If Not IsNull(maxStrLenTemp) Then
If CInt(maxStrLenTemp) > CInt(finalMaxLenArray(i)) Then
finalMaxLenArray(i) = maxStrLenTemp
End If
rsSelect.MoveNext
Loop
' If the derived col length is greater than the maxcollen parameter
' then reset col length.
If IsArray(maxcollen) = True Then
If CInt(maxcollen(i)) < > -1 Then
If finalMaxLenArray(i) > CInt(maxcollen(i)) Then
finalMaxLenArray(i) = CInt(maxcollen(i))
End If
Else
If CInt(maxcollen) < > -1 Then
If finalMaxLenArray(i) > CInt(maxcollen) Then
finalMaxLenArray(i) = CInt(maxcollen)
End If
End If
Next
也许你能注意到,在以上代码中进行了许多整理Trim(exampleVar) 和重塑CInt(examplevar)工作。当你 处理返回的记录集值时,应该将结果进行一下整理,去掉一些额外的空白。养成整理返回值的习惯能 节约许多调试的时间,是个很好的编码习惯。当对两个值进行比较时,将值重塑成所希望的数据类型 也是很好的。因为ASP只有一种数据类型vari
ant,如果不将它们进行重塑的话,简单的比较过程也会变得难以预料。有时候重塑是多余的(甚至不必要)--但是,我的观点是只要有疑问,就进行重塑。
代码的下一部分就是我们实际构造选项列表的地方。现在我们已经有了所需要的格式信息(包含在 finalMaxLenArray中),可以在确定的栏宽的基础上创建选项列表的单独的行。开始我们设置 选项列表的第一部分:
< SELECT id="< %=name% >" class="aspmultiselect"
name="< %=name% >" size="< %=size% >" style="< %=style% >" < %=optattr% > >
这里我们用许多参数设置选项列表的属性,如大小、字体(只对IE有效,可以为定宽字体传递Font 类属性)。你可以使用optattr 参数来规定其它任何属性或列表中所需要的
JavaScript 函数。另外,有时候我打乱ASP代码而直接写HTML,而不用ASP的Response.Write 来写出HTML。在保持代码区不被打断这方面,有些
开发人员是纯粹主义者,而我却觉得这样带来的麻烦多于方便。
firstopt参数允许我创建一个空白第一选项,其值与我的参数值相等。如果我将值设置为等于|* , 那么就没有空白第一选项。
< % If Trim(firstopt) < > "|*" Then% >
< OPTION VALUE="< %=firstopt% >" >
< % End If% >
然后通过调用MoveFirst Method,将记录集初始化到它的起点。
< %
'Build the select list now that we have formating info.
If Not rsSelect.BOF Then rsSelect.MoveFirst
Do While Not rsSelect.EOF
然后设置一个临时变量来保存我们的返回值。这个值最终就是多栏选项列表中给定行的索引值。
valTemp = Trim(rsSelect(val))
下面我们在栏数组中循环。这个数组包含记录集栏值的名,它被用来为我们的列表返回值。
For n = 0 to UBound(column)
然后我们
测试空值。如果值为空,就用空字符串代替它。
If Not IsNull(rsSelect(column(n))) Then
descTemp = Trim( rsSelect(desc(n)))
Else
descTemp = ""
End If
下面我们来确定哪里的栏值长度与我们预先确定的最大长度相关。如果它较大,就将其截断,反之就增加无间隔空格,使字符串成为用finalMaxLenArray()测量的正确长度。
'strDif Can be negative number if maxcollen is in effect.
strDif = CInt(finalMaxLenArray(n)) - Len(descTemp)
If strDif < 0 Then
descTemp = Mid(descTemp, 1, finalMaxLenArray(n) + 1)
Else
For x = 0 to strDif '0 for one extra
descTemp = descTemp & " "
Next
End If
然后我们在字符串结尾处增加"|" 字符,然后将那个字符串增加到最后的字符串finalDesc上。 注意循环的次数要与选项列表中的栏数相当,这样结束时就可以有一个完整的选项列表行。
If n < > UBound(column) Then descTemp = descTemp & "|"
strDif = 0
然后:
finalDesc = finalDesc & descTemp
Next
% >
然后我们就写出我们的选项值。如果你希望在列表中有经过选择的值,就要使用许多参数。一旦我们写完行就回到开头,将一些参数重新设置成空字符串,用下一个记录集行将整个过程重做一遍。一旦所有这些选项都写出来之后,就关闭记录集和连接,终止函数。为了组合一个错误句柄程序,你可能 希望函数返回一个成功代码。
< OPTION < %If (Not IsNull(selval) Or Trim(selval) < > "") _
And selval = valTemp Then
Response.Write("SELECTED")% > VALUE="< %=valTemp% >" >< %=finalDesc% >
< %
finalDesc = ""
valTemp = ""
rsSelect.MoveNext
Loop
% >
< /OPTION >
< /SELECT >
< %
Set rsSelect = Nothing
End Function
% >
你可以看到,在创建这些多栏列表时包含一些overhead ,无论是在运行的时候还是在最终将它们展示给用户的时候。有时候调试这些创建列表的ASP代码是很头疼的。但是,它们是以有序的方式和正确的位置表现许多信息的很好的方式,是值得花费这些代价的.
原文转自:http://www.ltesting.net