当我使用以下代码打开表单时,我正在创建一些复选框:
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
}
}
}
我做错了什么/真的错了?
答案 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
}
}
祝发展顺利。