C# 将所有动态创建的复选框关联到同一事件处理程序

C# 将所有动态创建的复选框关联到同一事件处理程序,c#,C#,我试图根据用户输入的数据在面板上动态创建复选框。如果选中了其中任何一个,我想在面板外取消选中另一个复选框。看起来像这样: []全部 []具体1[]具体2[]具体3 以下是我创建复选框的方式: foreach (Camera cam in UserData.globalUserData.cameras) { box = new CheckBox(); box.Text = cam.Nickname;

我试图根据用户输入的数据在面板上动态创建复选框。如果选中了其中任何一个,我想在面板外取消选中另一个复选框。看起来像这样:

[]全部


[]具体1[]具体2[]具体3

以下是我创建复选框的方式:

        foreach (Camera cam in UserData.globalUserData.cameras)
        {
            box = new CheckBox();
            box.Text = cam.Nickname;

            box.AutoSize = true;
            box.CheckedChanged += new EventHandler(CheckedChanged);

            pnlCamTicky.Controls.Add(box);
        }
我的活动:

    private void CheckedChanged(object sender, EventArgs e)
    {
        foreach (Control c in pnlCamTicky.Controls)
        {
            if (c is CheckBox)
            {
                if (((CheckBox)c).Checked)
                {
                    chkAllCameras.Checked = false;
                }
                else
                {
                    chkAllCameras.Checked = true;
                }
            }
        }

    }
但这只适用于表单上动态创建的最后一个复选框。我认为当创建一个新的复选框时,eventhandler连接正在被覆盖


如何动态创建复选框,然后将它们连接到同一个事件处理程序?

else语句导致了问题。如果删除了该复选框,则它可以工作,但如果没有选中任何复选框,则需要单独的逻辑。

导致问题的是“else”语句。如果删除该复选框,则可以使用该选项,但如果未选中任何复选框,则需要单独的逻辑。

请尝试使用变量:

bool somethingChecked = false;
foreach (CheckBox cb in pnlCamTicky.Controls.OfType<CheckBox>()) {
  if (cb.Checked) {
    somethingChecked = true;
  }
}
chkAllCameras.Checked = somethingChecked;
boolsomethingchecked=false;
foreach(pnlCamTicky.Controls.OfType()中的复选框cb){
如果(cb.选中){
somethingschecked=真;
}
}
chkAllCameras.Checked=某些已检查的内容;

尝试改用变量:

bool somethingChecked = false;
foreach (CheckBox cb in pnlCamTicky.Controls.OfType<CheckBox>()) {
  if (cb.Checked) {
    somethingChecked = true;
  }
}
chkAllCameras.Checked = somethingChecked;
boolsomethingchecked=false;
foreach(pnlCamTicky.Controls.OfType()中的复选框cb){
如果(cb.选中){
somethingschecked=真;
}
}
chkAllCameras.Checked=某些已检查的内容;
作为一款别致的单行:

chkAllCameras.Checked = pnlCamTicky.Controls.OfType<CheckBox>().All(c => c.Checked);
chkAllCameras.Checked=pnlCamTicky.Controls.OfType().All(c=>c.Checked);
作为一款别致的单行:

chkAllCameras.Checked = pnlCamTicky.Controls.OfType<CheckBox>().All(c => c.Checked);
chkAllCameras.Checked=pnlCamTicky.Controls.OfType().All(c=>c.Checked);

您始终使用相同的chkAllCamers检查按钮。您应该在该循环中使用变量c。循环中的最后一个复选框始终以该逻辑获胜。是的,chkAllCameras不是正在循环的控件之一。它需要根据是否检查了正在循环的任何控件进行更改。我想如果我从事件处理程序中删除“else”语句,它会起作用,因为我是个笨蛋。因此,如果没有选中任何复选框,我需要有单独的逻辑。谢谢。问题不在于事件没有针对每个复选框触发,而是您在事件中正在做什么。请注意,
sender
参数是已更改的复选框,还请注意,当复选框被选中或未选中时,它将触发,因此您需要更正逻辑。您始终使用相同的chkallcars复选按钮。您应该在该循环中使用变量c。循环中的最后一个复选框始终以该逻辑获胜。是的,chkAllCameras不是正在循环的控件之一。它需要根据是否检查了正在循环的任何控件进行更改。我想如果我从事件处理程序中删除“else”语句,它会起作用,因为我是个笨蛋。因此,如果没有选中任何复选框,我需要有单独的逻辑。谢谢。问题不在于事件没有针对每个复选框触发,而是您在事件中正在做什么。请注意,
sender
参数是已更改的复选框,还请注意,当复选框已选中或未选中时,它将触发,因此您需要更正逻辑。如果要选中任何复选框,请将
All()
替换为
Any()
,但是如果是那样的话,我建议用另一个名字。选中一个复选框并不意味着您选中了所有复选框。如果您希望选中任何复选框,请将
all()
替换为
Any()
,但在这种情况下,我建议使用不同的名称。选中一个框并不意味着你选中了所有的框。