将所有动态创建的复选框连接到同一事件处理程序

时间:2015-11-02 19:20:46

标签: c#

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

[] ALL

[] Specific1 [] Specific2 [] Specific3

这是我创建复选框的方式:

        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;
                }
            }
        }

    }

但这仅适用于在表单上动态创建的LAST复选框。我认为在创建新复选框时会覆盖事件处理程序连线。

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

3 个答案:

答案 0 :(得分:0)

“else”声明导致了问题。如果删除了它,它就可以工作,但是如果选中了NONE的复选框,则需要单独的逻辑。

答案 1 :(得分:0)

尝试使用变量:

bool somethingChecked = false;
foreach (CheckBox cb in pnlCamTicky.Controls.OfType<CheckBox>()) {
  if (cb.Checked) {
    somethingChecked = true;
  }
}
chkAllCameras.Checked = somethingChecked;

答案 2 :(得分:0)

作为一个奇特的一个班轮:

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