|
|
| 用ASP创建多栏选项列表(2) |
| 作者:不详 来源:不详 发布时间:2006-8-13 0:35:38 发布人:chinazhan |
减小字体
增大字体
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只有一种数据类型variant,如果不将它们进行重塑的话,简单的比较过程也会变得难以预料。有时候重塑是多余的(甚至不必要)--但是,我的观点是只要有疑问,就进行重塑。 代码的下一部分就是我们实际构造选项列表的地方。现在我们已经有了所需要的格式信息(包含在 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代码是很头疼的。但是,它们是以有序的方式和正确的位置表现许多信息的很好的方式,是值得花费这些代价的. 做人要厚道,请注明转自chinazhan中国站长(www.ChinaZhan.com)。
|
| |
|
[]
[返回上一页]
[打 印]
[收 藏] |
|
| ∷相关文章评论∷ (评论内容只代表网友观点,与本站立场无关!) [更多评论...] |
|
|