在多项选择的一些应用中,可以用二进制1代表选中,0代表不选。例如给某用户角色分配权限abcdefg,选中情况是1001101,那么此角色包含四项权限,用一个变量表示,相应的十进制数是77。
但是,在ASP中的多项选择,就不适合这种以数值的形式记录选中情况。因为,当项目数很多时(例如64项,相应的二进制数达64位),就涉及大整数的运算,步骤繁杂,而且当项目数改变时,算法也要改变。
以下以字符的形式获取和还原ASP复选框的值,应用于角色分配、投票统计等领域,最多99项:
<script language="javascript">
function selectIt(){
form=document.lzyy
action=event.srcElement.name
for(var i=0; i<form.elements.length; i++){
if(form.elements[i].name=="test"){
e=form.elements[i]
e.checked=(action=="selectAll")?(form.selectAll.checked):(!e.checked)
}
}
}
</script>
<%
dim check,ch,test
check=99 '总项目数0~99
dim checked
redim checked(check) '各项的选中状态
if not request.form("action")="editselect" then %>
<form name="lzyy" action="" method="post">
<input type="checkbox" name="selectAll" value="checkbox" onClick="selectIt()"><b>全选</b>
<input type="checkbox" name="invest" value="checkbox" onClick="selectIt()"><b>反选</b>
<%
for chi=1 to check
ch="0"+cstr(chi)
ch=right(ch,2)
%>
<input type="checkbox" name="test" value="<%=ch%>">项目<%=ch%>
<%next%>
<input name="action" type="hidden" value="editselect" />
<input type="submit" name="Submit" value="选择" />
</form>
<%else%>
<BR>(还原选中情况:)<BR>
<%
test=request.form("test")
Response.Write "<br>选中之后,保存在数据库中的文本(例如01, 02, 03, 05 ):" & test & "<br>"
'循环取值/操作
'strCheck=Split(test,",")
'For I=0 To UBound(strCheck)
'Response.Write strCheck(I)
'Next
for chi=1 to check
ch="0"+cstr(chi)
ch=right(ch,2)
if Instr(test,ch) then
checked(chi)="checked" '已选中
else
checked(chi)=""
end if
next
%>
<form name="lzyyjs" action="" method="post">
<input type="checkbox" name="selectAll" value="checkbox" onClick="selectIt()"><b>全选</b>
<input type="checkbox" name="invest" value="checkbox" onClick="selectIt()"><b>反选</b>
<%for chi=1 to check
ch="0"+cstr(chi)
ch=right(ch,2)
%>
<input type="checkbox" name="test" value="<%=ch%>" <%=checked(chi)%>>项目<%=ch%>
<%next%>
<input name="action" type="hidden" value="editselect" />
<input type="submit" name="Submit" value="选择" />
</form>
<%end if%>