用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只有一种数据类型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代码是很头疼的。但是,它们是以有序的方式和正确的位置表现许多信息的很好的方式,是值得花费这些代价的.
  
  

原文转自:http://www.ltesting.net