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