【发布时间】:2011-08-14 09:54:20
【问题描述】:
我制作了一个获胜表格,并提供了一些复选框,显示学生可用的课程,通过选中复选框,他将能够告诉他他想要做什么课程,但我想在他检查三门课程时重新开始他和如果他尝试选中第四个复选框,那么应该出现消息框告诉他他不能选择超过三个并且不应该选中第四个复选框。那我该怎么做呢?
【问题讨论】:
我制作了一个获胜表格,并提供了一些复选框,显示学生可用的课程,通过选中复选框,他将能够告诉他他想要做什么课程,但我想在他检查三门课程时重新开始他和如果他尝试选中第四个复选框,那么应该出现消息框告诉他他不能选择超过三个并且不应该选中第四个复选框。那我该怎么做呢?
【问题讨论】:
使用复选框的CheckChanged event 并计算表单上当前选中复选框的数量,然后显示一个消息框并取消选中触发事件的复选框(如果当前超过 3 个)。
【讨论】:
假设您使用的是 WinForms,CheckBox 控件有一个 OnCheckStateChanged 事件。连接所有复选框的事件以调用另一个函数。在此功能中,您可以跟踪选中的框总数并显示一个弹出窗口,让用户知道已达到最大值。
【讨论】:
您必须实现一个 OnCheckedChange 处理程序并将其设置为每个复选框。 这会根据复选框的状态增加/减少计数器。
private int checkCounter;
private void OnCheckedChanged(object sender, EventArgs e)
{
// Increase or decrease the check counter
CheckBox box = (CheckBox) sender;
if (box.Checked)
checkCounter++;
else
checkCounter--;
// prevent checking
if (checkCounter == 4)
{
MessageBox.Show("YOU ARE EVIL", "Bad");
box.Checked = false;
}
}
如果达到您的计数,您可以输出一个消息框并重置复选框。 就是这样。
并且不要忘记将此检查处理程序应用于复选框的所有 CheckedChange 事件。
【讨论】:
我建议您在处理未知数量的选项时使用CheckedListBox。这是一个完整的示例,展示了如何使用ItemCheck 事件来限制选择的总数。
var box = new CheckedListBox
{
Dock = DockStyle.Fill,
CheckOnClick = true
};
box.ItemCheck += (sender, e) =>
{
// is the item being checked when 3 are already checked?
if (e.NewValue == CheckState.Checked && box.CheckedItems.Count == 3)
{
// block the change
e.NewValue = CheckState.Unchecked;
}
};
for (var i = 0; i < 10; i++)
{
box.Items.Add("item " + i);
}
new Form {Controls = {box}}.ShowDialog();
编辑: 您可以通过移除列表的边框、将其嵌套在 GroupBox 中并更改背景颜色来创建分组外观。
box.BorderStyle = BorderStyle.None;
box.BackColor = Control.DefaultBackColor;
box.MultiColumn = true;
box.IntegralHeight = false;
var group = new GroupBox
{
Text = "Options",
Dock = DockStyle.Fill,
Controls = {box}
};
【讨论】:
您必须为所有 CheckedBoxes CheckChanged 事件触发相同的事件处理程序。
CheckBox1.CheckedChanged += new System.EventHandler(MyCheckedChanged)
CheckBox2.CheckedChanged += new System.EventHandler(MyCheckedChanged)
private void MyCheckedChanged(object sender, EventArgs e)
{
CheckBox checkbox = sender as CheckBox;
// Check all the checked items. If already 3 selectec
checkbox.Checked = false;
}
【讨论】: