dropdownlist web 控件是一个下拉式的选单,功能和radiobuttonlist web 控件很类似,提供使用者在一群选项中选择单一的值;不过radiobuttonlist web 控件适合使用在较少量的选项群组项目,而dropdownlist web 控件则适合用来管理大量的选项群组项目。其使用语法如下:
<asp:dropdownlist
id="被程序代码所控制的名称"
runat="server"
autopostback="true | false"
*datasource="<%数据系结叙述%>"
*datatextfield="数据源的字段"
*datavaluefield="数据源的字段"
onselectedindexchanged="事件程序名称"
>
<asp:listitem/>
</asp:dropdownlist>
*关于和数据源的数据系结部分,我们在后面的章节再介绍。
下表为dropdownlist web 控件的常用属性:

下列范例将dropdwonlist web 控件填入十二个月:
<html>
<asp:dropdownlist id="ddla" runat="server">
<asp:listitem>1 月</asp:listitem>
<asp:listitem>2 月</asp:listitem>
<asp:listitem>3 月</asp:listitem>
<asp:listitem>4 月</asp:listitem>
<asp:listitem>5 月</asp:listitem>
<asp:listitem>6 月</asp:listitem>
<asp:listitem>7 月</asp:listitem>
<asp:listitem>8 月</asp:listitem>
<asp:listitem>9 月</asp:listitem>
<asp:listitem>10 月</asp:listitem>
<asp:listitem>11 月</asp:listitem>
<asp:listitem>12 月</asp:listitem>
</asp:dropdownlist>
</html>

不过上列的方法太麻烦,我们可以利用page_load 事件用程序动态的加入项目,如下范例所示:
<html>
<asp:dropdownlist id="ddla" runat="server"/>
<script language="vb" runat="server">
sub page_load(sender as object,e as eventargs)
dim shti as short
dim lia as listitem
for shti=1 to 12
lia=new listitem(shti.tostring & "月")
ddla.items.add(lia)
next
end sub
</script>
</html>
这样程序代码就简洁多了。若要取得dropdownlist web 控件被选取到的项目,则可以利用和radiobuttonlist web 控件一样的方法,参考dropdownlist web 控件的selecteditem 属性即可。下列范例当我们选择dropdownlist web 控件完毕后,按下按钮会将选取到的选项显示出来:
<html>
<form id="from1" runat="server">
<asp:dropdownlist id="ddla" runat="server"/>
<asp:button id="btna" text="请按我" onclick="btna_click"
runat="server"/>
</form>
<asp:label id="lbla" runat="server"/>
<script language="vb" runat="server">
sub page_load(sender as object,e as eventargs)
dim shti as short
dim lia as listitem
for shti=1 to 12
lia=new listitem(shti.tostring & "月")
ddla.items.add(lia)
next
end sub
sub btna_click(sender as object,e as eventargs)
lbla.text="您所选择的项目是" & ddla.selecteditem.text & _
" ,索引值是" & ddla.selectedindex.tostring
end sub
</script>
</html>

dropdownlist web 控件所支持的事件是selectedindexchanged 事件。若指定发生本事件要触发的事件程序,并将autopostback 属性设为true ,则当我们改变dropdownlist web 控件里的选项时,便会触发这个事件。下列范例将前一个范例的button web 控件拿掉,然后指定发生onselectedindexchanged 所要执行的事件程序,并将autopostback 设为true:
<html>
<form id="from1" runat="server">
<asp:dropdownlist id="ddla" autopostback="true"
onselectedindexchanged="ddla_changed" runat="server"/>
</form>
<asp:label id="lbla" runat="server"/>
<script language="vb" runat="server">
sub page_load(sender as object,e as eventargs)
dim shti as short
dim lia as listitem
for shti=1 to 12
lia=new listitem(shti.tostring & "月")
ddla.items.add(lia)
next
end sub
sub ddla_changed(sender as object,e as eventargs)
lbla.text="您所选择的项目是" & ddla.selecteditem.text & _
" ,索引值是" & ddla.selectedindex.tostring
end sub
</script>
</html>
选择正确的日期
这边我们来看一个比较实用的程序,它的作用是提供三个dropdownlist web 控件让使用者选择日期。但是这里并不是只有提供三个dropdownlist 控件就了事,而是可以依据正确的年份以及月份提供正确的日期选择,以避免有如2 月31 日这种错误日期的发生。下列范例限制使用者只能选择包括今天以后五年内的日期:
<html>
您认为两岸三通什么时候开放比较合适?
<form id="form1" runat="server">
<asp:dropdownlist id="d1" autopostback="true"
onselectedindexchanged="daychg"
runat="server"/>年
<asp:dropdownlist id="d2" autopostback="true"
onselectedindexchanged="daychg"
runat="server"/>月
<asp:dropdownlist id="d3" autopostback="true"
onselectedindexchanged="daychg"
runat="server"/>日
</form>
<asp:label id="label1" runat="server" />
<script language="vb" runat="server">
sub page_load(sender as object, e as eventargs)
if page.ispostback=true then return '如果不是第一次加载就不执行
dim shti as short
dim lia as listitem
for shti=year(now()) to year(now())+5 '加入未来五年内的时间
lia=new listitem(shti)
d1.items.add(shti)
next
for shti=1 to 12 '将月份填入
lia=new listitem(shti)
d2.items.add(shti)
next
d2.items(month(now())-1).selected=true '将选择到的项目显示为现在的
月份
for shti=1 to day(dateserial(year(now()),month(now())+1,1-1)) '取得
现在的月份有几天
lia=new listitem(shti)
d3.items.add(shti)
next
d3.items(day(now())-1).selected=true '将选择到的项目显示为现在的日
end sub
sub daychg(sender as object , e as eventargs)
'下列判断如果使用者选择日期不是今天之后, 则将日及回指定到今天
if dateserial(d1.selecteditem.text.toint16, _
d2.selecteditem.text.toint16, _
d2.selecteditem.text.toint16) < now then
d1.items(0).selected=true
d2.items(month(now())-1).selected=true
d3.items(day(now())-1).selected=true
return
end if
dim shti as short
dim lia as listitem
dim shtd as short
shtd=d3.selecteditem.text.toint16'储存使用者选取的日期
d3.items.clear '移除所有的项目
for shti=1 to day(dateserial(d1.selecteditem.text.toint16, _
d2.selecteditem.text.toint16+1,1-1))
lia=new listitem(shti)
d3.items.add(shti)
next
'下列判断如果使用者原先选的日期大于现在月份的日期,
'就选择第一天; 否则将原日期填回去
if day(dateserial(d1.selecteditem.text.toint16, _
d2.selecteditem.text.toint16+1,1-1)) < shtd then
d3.items(0).selected=true
else
d3.items(shtd-1).selected=true
end if
label1.text="您所选择的日期为" & d1.selecteditem.text & " 年" & _
d2.selecteditem.text & " 月" & _
d3.selecteditem.text & " 日"
end sub
</script>
</html>
