对于这个问题,我有一个很好的解决方案:
在 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 事件将检查复选框列表是否有超过限制的项目被选中,它将禁用其他项目,否则它将重新启用其他项目。