【问题标题】:Wiring all dynamically-created checkboxes to the same event handler将所有动态创建的复选框连接到同一个事件处理程序
【发布时间】:2015-11-02 19:20:45
【问题描述】:

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

[]全部


[]具体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;
                }
            }
        }

    }

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

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

【问题讨论】:

  • 您使用的是始终相同的 chkAllCamers 复选按钮。您应该在该循环中使用变量 c
  • 循环中的最后一个复选框始终以该逻辑获胜。
  • 是的,chkAllCameras 不是循环通过的控件之一。它需要根据是否检查任何正在循环的控件进行更改。我认为如果我从事件处理程序中删除“else”语句,它会起作用,因为我是个笨蛋。所以如果没有选中任何复选框,我只需要有单独的逻辑。谢谢。
  • 问题不在于事件没有针对每个复选框触发,而是您在事件中所做的事情。注意sender参数是被改变的复选框,同时注意它会在复选框被选中和未选中时触发,所以你需要更正你的逻辑。

标签: c#


【解决方案1】:

尝试使用变量:

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

【讨论】:

    【解决方案2】:

    “else”语句引起了问题。如果将其删除,它会起作用,但如果未选中任何复选框,则需要单独的逻辑。

    【讨论】:

      【解决方案3】:

      作为一个花哨的班轮:

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

      【讨论】:

      • 如果您希望在选中 any 复选框的情况下检查它,请将 All() 替换为 Any(),但在这种情况下我会建议使用不同的名称。选中一个框并不意味着您选中了所有框。
      猜你喜欢
      • 2019-01-29
      • 2011-12-21
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      • 2017-01-20
      相关资源
      最近更新 更多