0

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

检查项目的最大数量将在代码隐藏 (C#) 中设置为 ChecokBoxList 或使用 javascript 执行此操作,但 javascript 也应该在 C# 中生成。

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

示例代码:

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 将只允许用户检查三个项目。如果用户检查了三个以上的项目,其他项目将自动取消选中,或者至少会显示一个警报以防止用户检查三个以上的项目。

4

4 回答 4

1

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

在 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 属性设置的,假设 CheckBoxList 中不需要 CssClass。所以我会通过这个属性设置最大检查项,以使其更加清晰。这里的关键是在 CheckboxList 上添加一个 EventHandler,这样如果用户要检查的项目超过最大项目,其他项目将被禁用。

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 { }
}  

EventHandler 事件将检查复选框列表是否有超过限制的项目被选中,它将禁用其他项目,否则它将重新启用其他项目。

于 2013-03-03T03:41:14.267 回答
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>

于 2013-03-03T03:36:28.983 回答
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 中检查超过最大项目而不进行一些回发。

于 2013-03-03T04:59:16.387 回答
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");

        }
    }
于 2016-11-02T01:05:08.383 回答