Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c中访问动态创建的复选框#_C#_Winforms_Forms_Checkbox - Fatal编程技术网

C# 在c中访问动态创建的复选框#

C# 在c中访问动态创建的复选框#,c#,winforms,forms,checkbox,C#,Winforms,Forms,Checkbox,使用以下代码打开表单时,我正在创建几个复选框: private void OpenFolder_Load(object sender, EventArgs e) { int i = 0; foreach (string file in filesToOpen) { Label lbl = new Label(); lbl.Text = Path.GetFileNameWithoutEx

使用以下代码打开表单时,我正在创建几个复选框:

    private void OpenFolder_Load(object sender, EventArgs e)
    {
        int i = 0;
        foreach (string file in filesToOpen)
        {
            Label lbl = new Label();
            lbl.Text = Path.GetFileNameWithoutExtension(file);
            lbl.Width = 200;
            lbl.Height = 25;
            lbl.AutoEllipsis = true;
            lbl.Location = new System.Drawing.Point(10, 40 + 25 * i);

            this.Controls.Add(lbl);

            string checkName = "check" + i;
            CheckBox check = new CheckBox();
            check.Checked = true;
            check.AccessibleName = checkName;
            check.Location = new System.Drawing.Point(340, 40 + 25 * i);
            check.CheckedChanged +=new EventHandler(check_CheckedChanged);

            this.Controls.Add(check);

            CheckBoxes.Add(check);

            i++;
        }
每次切换“确定”按钮时,我都会尝试检查复选框的状态(只有在选中了一定数量的复选框时,用户才能进行验证)

下面是我使用的代码,但它失败了,因为我无法针对复选框:

    private void check_CheckedChanged(Object sender, EventArgs e)
    {
        for (int i = 0; i < filesToOpen.Count(); i++)
        {
            string tbarName = "tbar" + i;
            string checkName = "check" + i;

            CheckBox ckb = this.Controls.OfType<CheckBox>()
                     .Where(c => c.AccessibleName.Equals(checkName)) as CheckBox;
            TrackBar tkb = this.Controls.OfType<TrackBar>()
                     .Where(t => t.AccessibleName.Equals(tbarName)) as TrackBar;
            //TrackBar tkb = this.Controls.Find(tbarName, false).First() as TrackBar;
            //CheckBox ckb = this.Controls.Find(checkName, false).First() as CheckBox;

            if (ckb.Checked == true)
            {
                //do stuff
            }
        }
    }
private void check\u CheckedChanged(对象发送方,事件参数e)
{
对于(int i=0;ic.AccessibleName.Equals(checkName))作为复选框;
TrackBar tkb=this.Controls.OfType()
其中(t=>t.AccessibleName.Equals(tbarName))作为轨迹栏;
//TrackBar tkb=this.Controls.Find(tbarName,false).First()作为TrackBar;
//CheckBox ckb=this.Controls.Find(checkName,false).First()作为复选框;
如果(ckb.Checked==true)
{
//做事
}
}
}
我做错了什么/真的做错了什么?

检查“this”的类型,然后检查它的控件集合-您的复选框可能在树上重复了几次


如果您将复选框添加到自己的列表中,则需要某种递归查找控件功能,例如查找的功能:

CheckBoxes.Add(check);
在上面循环比试图查找与文件关联的控件更简单:

foreach (var checkBox in CheckBoxes)
{
    if (checkbox.Checked)
    {
        // Do stuff...
    }
}
但是,您不需要使用单独的列表。这一行是错误的:

CheckBox ckb = this.Controls.OfType<CheckBox>()
                   .Where(c => c.AccessibleName.Equals(checkName)) as CheckBox;

您仍然需要检查
ckb
是否为空(以防万一列表中没有任何内容),但这应该会返回您要查找的控件。

不需要每次检查都重复所有复选框,这是一项非常困难的处理工作。相反,在创建时,你总是知道你是在什么状态下创建的,所以只需保持“选中”复选框的计数。选中复选框时,增加计数;未选中复选框时,从计数中取出1。然后检查:“if(count==requiredCount){//Logic here}” 因此,代码如下所示:

private int checkedCount;
private void check_CheckedChanged(Object sender, EventArgs e) 
{
  this.checkedCount += (sender as CheckBox).Checked?1:-1;
  if(this.checkedCount == requiredCount)
  { 
    //do stuff 
  } 
}

祝您发展顺利。

复选框。添加(选中)是一次尝试的结果,事实上我没有成功地将复选框添加到列表中。。。在尝试添加时,我得到一个nullreferenceexceptionanything@ThomasC-您是否已初始化
复选框
?谢谢!它解决了这个问题!我得到一个nullreferenceexception,因为CKBW中没有任何内容。为什么不使用控件的属性“name”而不是“accessibleName”。如果我不记得这样做有错,您可以通过“this.Controls[checkName]”访问它们
private int checkedCount;
private void check_CheckedChanged(Object sender, EventArgs e) 
{
  this.checkedCount += (sender as CheckBox).Checked?1:-1;
  if(this.checkedCount == requiredCount)
  { 
    //do stuff 
  } 
}