暮白兄、孟子等高手进,希望能得到一点启发!
在做一个选举系统的时候,出现一个问题。用CheckBoxList绑定被选举人。选举名额是规定的。为了防止用户多选,我在CheckBoxList触发事件中做了如下处理。
private void CheckBoxList1_SelectedIndexChanged(object sender, System.EventArgs e)
{
int x,y,z=0;
y=0;
for(x=0;x <this.CheckBoxList1.Items.Count;x++)
{
if(this.CheckBoxList1.Items[x].Selected)
{
y=y+1;//得到用户一共选了几项
z=x;//将用户选项的索引赋给z
}
}
n=Convert.ToInt32(this.Label2.Text);//n是规定的选举名额
//Response.Write(n);
//下面判断用户选举的人数是否大于规定名额
if(y> n)
{
Response.Write( " <script language= 'javascript '> alert( '您的选举人数超过指定范围! '); </script> ");
this.CheckBoxList1.Items[z].Selected=false;//问题出现的关键地方//如果用户选举人数大于规定的人数则提示用户,*并且让用户超出规定的选项取消选择*
return;
}
}
现在的问题是这样的——比如规定选举名额数为3人,即n取的指等于3,用户先选择三个选项,再选择这三个选项的后面的项(注意是后面的项),那么会提示用户“您的选举人数超过指定范围!”,点击此对话框“确定”以后,系统将选择的第四项取消选择(这样没有任何问题)。但,但,但,如果用户选择了三个选项,再选择这三个选项的前面的项(注意是前面的项),那么这时会提示“您的选举人数超过指定范围!”(到这里也没有问题),问题在这里,当这个对话框出来你点击“确定”以后,用户刚才多选的项并没有取消,而是将用户前面选择的三项中的最后一项取消了!奇怪!
不知道大家听懂了没有?如果听懂了,请指教一哈,应该是程序上的问题,如果没听懂,我再描述清楚点。
------解决方案--------------------if(this.CheckBoxList1.Items[x].Selected)
{
y=y+1;//得到用户一共选了几项
z=x;//将用户选项的索引赋给z
}
}
//逻辑错误
------解决方案--------------------你记录的是按items的显示顺序的最后选中的一个.
而不是你点选顺序的最后一个.
------解决方案--------------------这种逻辑更应该用js 控制,服务器端只处理提交上来具体内容
------解决方案--------------------为什么可以用客户端解决的问题还要用服务器端控件来做呢?
------解决方案--------------------用 JS 记录选择的索引并顺序保存在数组中,
每次加选或减选都对数组做处理就可以了,
其实就是用数组来保持状态,好像不必在 Server 端大动干戈吧!