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()
,但在这种情况下,我建议使用不同的名称。选中一个框并不意味着你选中了所有的框。