关于ASP.NET DataList中RadioButton多选的问题
最近碰到一个
问题,ASP.
NET中,本来RadioButton的Groupname是为了标识同一组RadioButton准备的,也就是说如果Groupname相同,那么认为是同一组单选按钮,同一时间只能选中其中一个。翻译成客户端代码的时候,会把Groupname翻译成html里面的name。
但是DataGrid或DataList模板列中,如果放置了一个RadioButton控件,其设置的Groupname是无效的。原因在于,在转换成客户端代码时,控件的name会变成DataList名:_ct行号:Groupname名。这样,每一行的RadioButton也就有了不同的name,这样html就会认为是不同组的RadioButton,也就造成了控制单选无效的结果。
在网上
搜索了下,解决方法有几种,一种是RadioButton的AutoPost设为true,这样每次点击单选按钮就会回传,然后在触发的代码里把其他按钮的选择清空。但是这样频繁回传,不是一个好办法。有篇文章也写到了一种javascript控制的方法,但我看了一下,发现有bug。正好之前用javascript实现菜单树状显示的时候,写过相似的代码(显示某一父菜单的子菜单时,其他父菜单的子菜单会隐藏)。原理是差不多的,实现办法看似比较笨,但很管用。也就是在每一行的RadioButton的onclick事件里,将其他行的RadioButton选择一行行清空。打个比方,假如只有一个顾客吃饭,他从其他桌改坐二号桌,那么就去检查清理下其他桌上有没遗漏什么东西,清理一号桌,清理三号桌,清理四号桌……
假如DataList名叫DataListABC,模板列里面的RadioButton叫RadioButtonABC.
for(i=0;i
{
rb=(RadioButton)DataListABC.Items[i].FindControl("RadioButtonABC");
sTemp="";
for(j=0;j {
if(j!=i)
{
rb2=(RadioButton)DataListABC.Items[j].FindControl("RadioButtonABC");
sTemp=sTemp+"uncheck('"+rb2.ClientID+"');";
}
}
if(sTemp!="")
{
rb.Attributes.Add("onclick",sTemp);
}
}
然后在页面的html的head部分加上一段javascript。
function uncheck(a)
{ var targetElement;
targetElement=document.getElementById(a);
if(targetElement!=null)
{ targetElement.checked=false;
}
}
就这么简单,你会发现RadioButton已经限制单选了。
这个RadioButton的Groupname问题,不仅存在于VS2003的ASP.NET1.1,VS2005也依然存在。……