2013-03-03 47 views
0

我生成了一个CheckBoxList,它有多个使用C#的项目。现在我想设置CheckBoxList中允许的最大检查项目数。如果用户检查超过最大允许的项目,将会有警报或其他项目将自动取消选中,以防止用户检查允许的最大项目数。CheckBoxList中允许的最大值checked

检查项目的最大数量将被设置为ChecokBoxList在后台代码(C#)或用javascript做到这一点,但也应该在C#中也可以产生的JavaScript。

我需要一些帮助来解决这个问题。

例如代码:

CheckBoxList chkl = new CheckBoxList(); 
string[] items = {"item1", "item2", "item3", "item4", "item5"}; 
foreach (string item in items) 
      { 
       chkl.Items.Add(new ListItem(item)); 
      } 
chkl.MaximumCheck = 3; 

在后台代码生成后,将的CheckBoxList将只允许用户检查仅三个项目。如果用户检查三个以上的项目,其他项目将自动取消选中或至少显示一个警报,以防止用户检查三个以上的项目。

+0

如果试图检查第四项,会有警报显示,以用户,他们不能做更多的检查,或第四检查不能做,因为它是一个可禁用。 – 2013-03-03 03:14:33

+0

我将尝试在C#中使用回发​​功能编写代码,以便每当用户检查checkboxlist上的任何项时执行此操作。稍后我会告诉你在我的问题上的进一步帮助。 – 2013-03-03 03:20:57

回答

1
int x = 0; 
foreach (var li in ListBox1.Items) { 
if (li.Selected == true) 
{ 
    x = x + 1; 
} 

或类似:

ListBox1.GetSelectedIndices().Length 

在Javascript中:

<script type="text/javascript" language="javascript"> 
function CheckCheck() 
{ 
    var chkBoxList=document.getElementById('<%=CheckBoxList1.ClientID %>');  var chkBoxCount=chkBoxList.getElementsByTagName("input"); 

    var btn=document.getElementById('<%=btnSubmit.ClientID %>'); 
    var i=0; 
    var tot=0; 
    for(i=0;i<chkBoxCount.length;i++) 
    { 
     if(chkBoxCount[i].checked) 
     { 
     tot=tot+1; 
     } 
    } 

if(tot > 3) 
{ 
    alert('Cannot check more than 3 check boxes');    
}  
</script> 
<form id="form1" runat="server"> 
<div> 
<table> 
<tr> 
<td> 
<asp:CheckBoxList ID="CheckBoxList1" runat="server" onclick="javascript:CheckCheck();"> 
<asp:ListItem>One</asp:ListItem> 
<asp:ListItem>Two</asp:ListItem> 
<asp:ListItem>Three</asp:ListItem> 
<asp:ListItem>Four</asp:ListItem> 
<asp:ListItem>Five</asp:ListItem> 
</asp:CheckBoxList> 
</td> 
<td> 
<asp:Button ID="btnSubmit" runat="server" Text="Submit" /> 
</td> 
</tr> 
</table> 

+0

这是我想要的,因为没有必要检查后回事件。但是有一些东西错过了我的目标,动态控件有很多不同的ID,以及javascript如何识别哪个checkbolist会调用它?以及它如何知道任何单个复选框列表的最大检查属性? – 2013-03-03 04:12:28

+0

我自己的答案已经解决了这个问题,但它需要一个回发事件。这就是我要避免的,因为我将动态控制添加到updatepanel。因此,任何回传可能会破坏aspx页面的当前视图状态。 – 2013-03-03 04:16:25

0

我对这个问题的一个很好的解决方案:

在C#中,我将生成使用此代码5项的CheckBoxList:

CheckBoxList chkl = new CheckBoxList(); 
    string[] items = { "item1", "item2", "item3", "item4", "item5" }; 
    foreach (string item in items) 
    { 
     chkl.Items.Add(new ListItem(item)); 
    } 
    chkl.AutoPostBack = true; 
    chkl.CssClass = "3"; 
    chkl.SelectedIndexChanged += new EventHandler(BoxChecked); 

正如你所看到的,CheckBoxList的有5项,最大检测项目通过的CheckBoxList的的CssClass属性seted,假设将有在CheckBoxList中不需要CssClass。所以我会通过这个属性来设置最大的检查项目,以使其更加清晰。这里的关键是要增加对CheckBoxList的一个事件处理程序,因此,如果用户要检查比最大的项目较多,其他项目将被禁用。

的EventHander将被写入如下:

protected void BoxChecked(object sender, EventArgs e) 
{ 
    try 
    { 
     int maximumCheck = -1; 
     CheckBoxList CheckExpertiseList = (CheckBoxList)sender; 
     try { 
      maximumCheck = Convert.ToInt32(CheckExpertiseList.CssClass); 
     } 
     catch { } 
     if (maximumCheck > -1) 
     { 
      if (CheckExpertiseList.Items.Cast<ListItem>().Where(i => (i.Selected == true)).Count() == maximumCheck) 
      { 
       CheckExpertiseList.Items.Cast<ListItem>().Where(i => (i.Selected == false)).ToList().ConvertAll(i => i.Enabled = false).ToList(); 
      } 
      else if (CheckExpertiseList.Items.Cast<ListItem>().Where(i => (i.Selected == true)).Count() == maximumCheck - 1) 
       CheckExpertiseList.Items.Cast<ListItem>().Where(i => (i.Selected == false)).ToList().ConvertAll(i => i.Enabled = true).ToList(); 
     } 
    } 
    catch { } 
} 

事件处理事件将检查的CheckBoxList拥有超过限制的项目检查的话将禁用其他物品,否则将重新启用其他项目。

0

首先,我感谢你杰里米·汤普森。他为我的问题给了我一个好主意。有点改变,我有我想要的。只使用JavaScript解决我的问题。

<title>Untitled Page</title> 
</head> 
<body> 
<form id="form1" runat="server"> 
<div> 
<script type="text/javascript" language="javascript"> 
    function CheckCheck() { 
     var chkBoxCount = this.getElementsByTagName("input"); 
     var max = parseInt(this.className); 
     var i = 0; 
     var tot = 0; 
     for (i = 0; i < chkBoxCount.length; i++) { 
      if (chkBoxCount[i].checked) { 
       tot = tot + 1; 
      } 
     } 

     if (tot > max) { 
      var k = 0; 
      for (i = 0; i < chkBoxCount.length; i++) { 
       if (chkBoxCount[i].checked) { 
        k++; 
        if (k > max) { 
         chkBoxCount[i].checked = false; 
         alert('Cannot check more than ' + max + ' check boxes'); 
        } 
       } 
      }    
     } 
    } 
</script> 
<div> 
<table> 
<tr> 
<td> 
<asp:CheckBoxList ID="CheckBoxList1" runat="server" CssClass="3" onclick="javascript:CheckCheck.call(this);"> 
<asp:ListItem>One</asp:ListItem> 
<asp:ListItem>Two</asp:ListItem> 
<asp:ListItem>Three</asp:ListItem> 
<asp:ListItem>Four</asp:ListItem> 
<asp:ListItem>Five</asp:ListItem> 
</asp:CheckBoxList> 
</td> 
<td> 
<asp:Button ID="btnSubmit" runat="server" Text="Submit" /> 
</td> 
</tr> 
</table> 
</div> 
</form> 
</body> 
</html> 

的JavaScript将自动识别哪些控制会调用它,它也可以通过控制属性的CssClass得到最大的检查项目。通过这样做,我也阻止用户检查比CheckBoxList的最大项目多而不做一些后回。

0
private void cb_magia_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     int maxNumber = 4; 
     int iSelectedIndex = cb_magia.SelectedIndex; 
     if (cb_magia.CheckedItems.Count > maxNumber) 
     { 
      cb_magia.SetItemCheckState(iSelectedIndex, CheckState.Unchecked); 
      MessageBox.Show("you had checked the maximum checkbox value allowed"); 

     } 
    } 
相关问题