C# C中的复选框#

C# C中的复选框#,c#,winforms,C#,Winforms,如何在不触发check changed函数的情况下动态检查复选框?我有20个动态创建的复选框,我有一个下拉列表,确定要选中多少个复选框 如果我选择3并单击第6个复选框,则应选中复选框9、7和8。在这个过程中,我不想触发checkchanged函数 CheckBox cb1 = (CheckBox)sender; selectedbox = int.Parse(cb1.Name); for (int i = 1; i < selectedquantity; i++) { premi

如何在不触发check changed函数的情况下动态检查复选框?我有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++;
}
复选框cb1=(复选框)发送方;
selectedbox=int.Parse(cb1.Name);
对于(int i=1;i
当复选框的状态发生变化时,您无法阻止它触发事件。考虑在不需要的时候取消订阅:

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;

我看不出真正的解决办法是如何不触发事件。您可以使用-=禁用事件,然后使用+=再次添加它

 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
}
重新订阅(取消订阅/订阅)技术不是很好,因为您必须处理每个事件处理程序,使其变得通用,添加标志,等等

真正简单的做法是使用另一个事件-
单击
,简单地检查用户对控件所做的更改:

很明显,如果数据是以编程方式更改的,那么您必须实现不同的模式来实际处理数据(保存数据或对更改作出反应)。在上面的示例中,单击
checkBox2
将运行处理程序,例如,您可以在其中将某些内容保存到配置中,而设置
checkBox2.Checked=true
,当单击
checkBox1
时,将不会运行该处理程序


可能会发生这样的情况,对于某些
复选框
,您将只使用
单击
,对于其他人-仅
检查更改

无论您是否需要,都将触发
检查更改
事件。
{
    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
}
    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
    }