前面所我所写的文章中有关两个DropdownList连动的例子。当我们需要取第二个DropdownList的值时,会碰到取不到的情况:
比如,你页面有一个按钮,点击按钮时,获取它的值:string tmp = BList.SelectedValue; ,这时,你断点到它的下一句,在监视里面看tmp的结果是""。
网上搜索了一下,仅仅找到一个相关的帖子:http://topic.csdn.net/t/20030212/11/1419881.html。差不多就是这个情况,而我的做法也是,在第二个DropDownList触发onchange事件后,调用javascript将当前选中值添加到隐藏域:
{
document.Form1.PListValue.value = document.getElementById( " PList " ).value;
}
PListValue为隐藏域,PList为第二个DropdownList。同时,你需要做一个补充,万一用户在连动第二个DropList后,没有更改它的选项,那就不会触发onchange事件,那么隐藏域仍然为空,你需要在js向第二个DropdownList写option对象后,将它的value赋给隐藏域。那么差不多就解决了这个问题,下面是我前面文章中,向第二个DropdownList写option的方法,红色为添加行:
{
if (response != null )
{
var ds = response.value;
clearList();
if (ds != null && typeof (ds) == " object " )
{
for ( var i = 0 ;i < ds.Rows.length;i ++ )
{
var option = document.createElement( " OPTION " );
option.value = ds.Rows[i].RegionId;
option.text = ds.Rows[i].RegionName;
document.Form1.PList.options.add(option);
}
}
document.Form1.PListValue.value = document.getElementById("PList" ).value;
}
}
补充:导致这个问题的原因是,脚本数据没有写入ViewState。其实,我们可以这样处理:在第一次进入这个页面时,将第二个DropdownList所有可能的项,加载进来。然后,你第一个DropdownList触发的onchange事件后的处理——只是对这些项的筛选。
以上补充方法经过测试,行得通。