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

时间:2012-07-31 08:07:14

标签: 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.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
            }
        }
    }

我做错了什么/真的错了?

3 个答案:

答案 0 :(得分:1)

鉴于您将复选框添加到您自己的列表中:

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;

Where会返回IEnumerable<CheckBox>,但您尝试将其直接投放到CheckBox,而null将返回CheckBox ckb = this.Controls.OfType<CheckBox>() .Where(c => c.AccessibleName.Equals(checkName)).First(); 。你应该拥有的是:

ckb

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

答案 1 :(得分:0)

检查“this”的类型,然后检查它的Controls集合 - 你的复选框可能是树下的几次迭代。

您需要某种递归查找控件功能,例如找到的in this article

答案 2 :(得分:0)

不需要对所有复选框进行迭代,并且每次检查都不是必需的,并且只需要进行艰苦的处理工作。相反,在创建时,您始终知道您创建的那些状态 - 所以只需保留&#34; Checked&#34;复选框。当选中的复选框增加计数时,如果未选中,则从计数中取出1。然后检查一下:&#34; if(count == requiredCount){// Logic here}&#34; 所以代码看起来像:

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

祝发展顺利。