0

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

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

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

4

3 回答 3

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返回 aIEnumerable<CheckBox>但您试图将其直接转换为 aCheckBox将返回null。你应该拥有的是:

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

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

于 2012-07-31T08:15:01.457 回答
0

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

您需要某种递归查找控件功能,例如本文中的功能

于 2012-07-31T08:12:49.507 回答
0

不需要每次检查都遍历所有复选框,这是非常困难的处理工作。相反,在创建时,您始终知道创建它们的状态 - 所以只需保留“已选中”复选框的数量。当一个复选框被选中时增加计数,当一个未选中时 - 从计数中取出 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 
  } 
}

祝你发展顺利。

于 2012-07-31T08:56:27.320 回答