[英]Check boxes in C#
如何動態檢查框而不激活檢查更改功能? 我有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++;
}
當狀態發生變化時,您無法阻止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;
//...
}
我無法看到真正的解決方案如何不發射事件。 您可以使用 - =禁用該事件,然后使用+ =再次添加它。
checkBox.CheckedChanged -= checkBox_CheckedChanged;
checkBox.Checked = true;
checkBox.CheckedChanged += checkBox_CheckedChanged;
這樣做的一大不足之處在於,如果您希望在更新值時有一次此事件,則必須手動觸發事件。
我寧願在類中設置一個標志,並在更新代碼中檢查此標志。
刪除附加的事件,然后在更改檢查后將其附加:
{
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
}
重新訂閱(取消訂閱/訂閱)技術不是很好,因為你必須處理每個事件處理程序,使其通用,添加標志等。
真正簡單的做法是使用另一個事件 - 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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.