如何动态检查框而不触发检查更改功能?我有20个动态创建的复选框,我有一个下拉菜单,用于确定要检查的复选框数。
如果我选中3并单击第6个复选框,则应选中复选框9,7和8.在此过程中,我不想触发checkchanged功能。
CheckBox cb1 = (CheckBox)sender;
selectedbox = int.Parse(cb1.Name);
for (int i = 1; i < selectedquantity; i++)
{
premiumticket[selectedbox].Checked = true;
//here check changed firing i dont want that
selectedbox++;
}
答案 0 :(得分:8)
当状态发生变化时,您无法阻止CheckBox触发事件。当您不需要时,请考虑取消订阅活动:
for (int i = 0; i < selectedquantity; i++)
{
premiumticket[selectedbox + i].CheckedChanged -= checkBox_CheckedChanged;
premiumticket[selectedbox + i].Checked = true;
premiumticket[selectedbox + i].CheckedChanged += checkBox_CheckedChanged;
}
如果您不需要,请使用某些标记来省略事件处理:
flag = false;
for (int i = 0; i < selectedquantity; i++)
premiumticket[selectedbox + i].Checked = true;
flag = true;
在处理程序中:
private void checkBox_CheckedChanged(object sender, EventArgs e)
{
if (!flag)
return;
//...
}
答案 1 :(得分:1)
我无法看到真正的解决方案如何不发射事件。您可以使用 - =禁用该事件,然后使用+ =。
再次添加它 checkBox.CheckedChanged -= checkBox_CheckedChanged;
checkBox.Checked = true;
checkBox.CheckedChanged += checkBox_CheckedChanged;
这样做的一大不足之处在于,如果您希望在更新值时有一次此事件,则必须手动触发事件。
我宁愿在类中设置一个标志,并在更新代码中检查此标志。
答案 2 :(得分:0)
删除附加的事件,然后在更改检查后附加它:
{
cb1.CheckedChanged -= new EventHandler(cb1_CheckedChanged);
premiumticket[selectedbox].Checked = true;
cb1.CheckedChanged += new EventHandler(cb1_CheckedChanged);
}
private void cb1_CheckedChanged(object sender, EventArgs e)
{
// Some COde
}
答案 3 :(得分:0)
重新订阅(取消订阅/订阅)技术并不是很好,因为你必须处理每个事件处理程序,使其通用,添加标志等。
真正简单的做法是使用另一个事件 - Click
- 简单地检查控件的更改由用户制作:
private void checkBox1_Click(object sender, EventArgs e)
{
checkBox2.Checked = checkBox1.Checked;
checkBox3.Checked = false;
}
private void checkBox2_Click(object sender, EventArgs e)
{
// this is not called when you set "Checked" programmatically
}
很明显,如果以编程方式更改,您需要实现不同的模式,实际对数据执行某些操作(保存或对更改做出反应)。在上面的示例中,点击checkBox2
将运行处理程序,例如,您可以将某些内容保存到配置中,而在设置checkBox2.Checked = true
时,单击checkBox1
则不会。
可能会发生,对于某些CheckBox
,您将仅使用Click
,而对其他人仅使用CheckedChanged
。