暮白兄、孟子等高手进,希望能得到一点启发!

liping19851014 2007-04-12 02:12:28
在做一个选举系统的时候,出现一个问题。用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,用户先选择三个选项,再选择这三个选项的后面的项(注意是后面的项),那么会提示用户“您的选举人数超过指定范围!”,点击此对话框“确定”以后,系统将选择的第四项取消选择(这样没有任何问题)。但,但,但,如果用户选择了三个选项,再选择这三个选项的前面的项(注意是前面的项),那么这时会提示“您的选举人数超过指定范围!”(到这里也没有问题),问题在这里,当这个对话框出来你点击“确定”以后,用户刚才多选的项并没有取消,而是将用户前面选择的三项中的最后一项取消了!奇怪!
不知道大家听懂了没有?如果听懂了,请指教一哈,应该是程序上的问题,如果没听懂,我再描述清楚点。
...全文
1078 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
hbdn520 2007-05-07
  • 打赏
  • 举报
回复
oooooooo!!
liping19851014 2007-04-12
  • 打赏
  • 举报
回复
解决了!非常感谢各位!!!结贴!
得到一个经验:很多时候其实不需要给服务器太多的压力!实现的方法很多,看自己怎样去想!
再次拜谢大家!
yixianggao 2007-04-12
  • 打赏
  • 举报
回复
用 JS 记录选择的索引并顺序保存在数组中,

每次加选或减选都对数组做处理就可以了,

其实就是用数组来保持状态,好像不必在 Server 端大动干戈吧!
kunbrother 2007-04-12
  • 打赏
  • 举报
回复
这个问题不算复杂,就算暮白和孟子不进,也能解决的。

仔细想想你的Z取值就知道错误了,不需要用Z,直接把当前的多选框取消掉就可以了。
孟子E章 2007-04-12
  • 打赏
  • 举报
回复
上面的代码从 Request.Form["__EVENTTARGET"];
里得到你点击的是哪个。这个应该明白了吧
孟子E章 2007-04-12
  • 打赏
  • 举报
回复
<%@ Page Language="C#" AutoEventWireup="true" EnableViewState="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
int n = 3; //假定是3个选择
void CheckBoxList1_SelectedIndexChanged(object sender, System.EventArgs e)
{
//得到是哪个选择项
string ClickedItem = Request.Form["__EVENTTARGET"];
ClickedItem = ClickedItem.Split(':')[1];
int index = Int32.Parse(ClickedItem );
int x,y=0;
for(x=0;x<this.CheckBoxList1.Items.Count;x++)
{
if(this.CheckBoxList1.Items[x].Selected)
{
y=y+1;
if(y>n)
{
CheckBoxList1.Items[index].Selected=false;
Response.Write("<script language='javascript'>alert('您的选举人数超过指定范围!');</sc"+"ript>");
return;
}
}
}
}

</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="MengXianhui" runat="server">
<asp:CheckBoxList AutoPostBack="true" ID="CheckBoxList1" runat="server" OnSelectedIndexChanged="CheckBoxList1_SelectedIndexChanged">
<asp:ListItem Value="1">a</asp:ListItem>
<asp:ListItem>b</asp:ListItem>
<asp:ListItem>c</asp:ListItem>
<asp:ListItem>d</asp:ListItem>
<asp:ListItem>e</asp:ListItem>
</asp:CheckBoxList>
</form>
</body>
</html>



孟子E章 2007-04-12
  • 打赏
  • 举报
回复
所以我觉得这样的很难记录最后一个CheckBox?
每次点击都进行检查,如果这次的点击已经超过数量,就将这个点击的取消。这样就可以了,还有什么不能理解的吗?
junshanhudazhaxi 2007-04-12
  • 打赏
  • 举报
回复
上面的这么多回复,我还看不出来解决这个问题的方法。
-----
用循环是有序的,而选择的人是无序的,所以我觉得这样的很难记录最后一个CheckBox
稍微有点无敌 2007-04-12
  • 打赏
  • 举报
回复
这么多钻石,红星啊,呵呵
angelleecash 2007-04-12
  • 打赏
  • 举报
回复
星光闪闪~~~~~~~~~~~~
ConnectionString 2007-04-12
  • 打赏
  • 举报
回复
88888
super_paladin 2007-04-12
  • 打赏
  • 举报
回复
为什么可以用客户端解决的问题还要用服务器端控件来做呢?
真相重于对错 2007-04-12
  • 打赏
  • 举报
回复
b/s 是无状态的,所以服务器端的所有处理必须由客户端提交才能产生,你点击超过要求的checkbox的状态,这个信息无法直接传给服务器端,所以你非要在服务器端处理的话,把你点的最后一个checkbox 的id 通过js 写入到<input type=hidden runat=server id= "hi"〉
到服务器端用 hi.value 获得,再把这个value 通过
FinderControl(value) 找出 设为 checked = false

liping19851014 2007-04-12
  • 打赏
  • 举报
回复
恩 慕白兄 谢谢 我去试试
cpp2017 2007-04-12
  • 打赏
  • 举报
回复
function CheckSelect(tb) { var input = event.srcElement; if(input.tagName.toUpperCase() != "INPUT") return false; var max = 3; var n = 0; for(var i=0;i<tb.rows.length;i++) { if(tb.rows[i].firstChild.firstChild.checked) { n ++; } if( n >3) { alert("选多了!"); return false; } } }
cpp2017 2007-04-12
  • 打赏
  • 举报
回复
<asp:CheckBoxList onclick="javascript:return CheckSelect(this);" ID="CheckBoxList1" runat="server"> <asp:ListItem Value="1">a</asp:ListItem> <asp:ListItem>b</asp:ListItem> <asp:ListItem>c</asp:ListItem> <asp:ListItem>d</asp:ListItem> <asp:ListItem>e</asp:ListItem> </asp:CheckBoxList>
liping19851014 2007-04-12
  • 打赏
  • 举报
回复
其实很明白的,防止用户多选,如果多选,提示用户,并将多选的项取消选择。但现在有问题没有实现?
daishengs 2007-04-12
  • 打赏
  • 举报
回复
说实话,我真没看懂,不好意思了。
liping19851014 2007-04-12
  • 打赏
  • 举报
回复
问题还没解决,等我想想再结贴。
hmilyfm 2007-04-12
  • 打赏
  • 举报
回复
JF
加载更多回复(13)

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧