我想这样做:
CheckBox[] boxarray = new CheckBox[4];
boxarray[0] = checkBox1;
boxarray[1] = checkBox2;
boxarray[2] = checkBox3;
boxarray[3] = checkBox4;
使用for循环 - 因为我有大约600个复选框。我想到了这个:
for (int i = 0 ; i<= 600; i++)
{
boxes[i] = checkBox[i] ;
}
但无论我尝试过什么 - 它都行不通。我希望你知道我的意思。 谢谢你的帮助!
答案 0 :(得分:0)
您无法在代码中指定复选框的名称,因为i
不会更改。
你必须创建CheckBox的新实例,如:
for (int i = 0 ; i<= 600; i++)
{
//This will create a new instance of a CheckBox
CheckBox cb = new CheckBox()
//At this point the checkbox is empty and not visible anywhere
//So you have to change some properties:
cb.Text = "Check me!";
cb.Top = Ycoord; //you should change this depending on i like +(i*30)
cb.Left = Xcoord;
cb.name = "checkbox" + i.toString();
//To recognize if one of your Checkboxes is checked/unchecked you need to add
//an event like this (for the event see down below)
cb.CheckedChanged += checkedChangedEvent;
//then you need to add the checkbox to your Array
boxes[i] = cb;
//to make those checkboxes visible you need to add them to your form
//or Panel:
myForm.Controls.Add(cb);
}
活动:
public void checkedChangedEvent(Object sender, EventArgs e)
{
MessageBox.Show(((CheckBox)sender).name + " is now Checked == " + ((CheckBox)sender).Checked.toString();
}
您必须指定哪个Checkbox是由其名称检查/取消选中的,因为每个CheckBox都会触发相同的事件。
EDIT2:
获取复选框的编号,您可以在事件中执行以下操作:
int cbNumber = 0;
try
{
cbNumber = System.Convert.toInt32(((CheckBox)sender).name.Replace("checkbox",""));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + "\n\n" + ex.StackTrace);
}
答案 1 :(得分:0)
使用当前设置,您将不得不使用FindControl(假设ASP.net,winforms和WPF的工作方式不同):
for(int i = 0; i <= 600; i++)
{
boxes[i] = Page.FindControl("checkbox" + i);
}
Windows窗体更新:实际上有一种方法可用于查找特定类型的所有控件:
How to get ALL child controls of a Windows Forms form of a specific type (Button/Textbox)?
这是您的另一个选择。我通过创建一个样本来测试它 应用程序,然后我将一个GroupBox和一个GroupBox放在首字母中 分组框中。在嵌套的GroupBox里面我放了3个TextBox控件和一个 按钮。这是我使用的代码(甚至包括你的递归 寻找)
public IEnumerable<Control> GetAll(Control control,Type type) { var controls = control.Controls.Cast<Control>(); return controls.SelectMany(ctrl => GetAll(ctrl,type)) .Concat(controls) .Where(c => c.GetType() == type); }
要在表单加载事件中测试它,我想要计算内部的所有控件 最初的GroupBox
private void Form1_Load(object sender, EventArgs e) { var c = GetAll(this,typeof(TextBox)); MessageBox.Show("Total Controls: " + c.Count()); }
每次都返回正确的计数,所以我认为这将完美适用 你在找什么:)
如果表单上有其他您不想添加的复选框,则必须使用以下方法:
for(int i = 0; i <= 600; i++)
{
boxes[i] = this.Controls.Find("checkbox" + i, true).FirstOrDefault() as CheckBox;
}
答案 2 :(得分:0)
如果您的表单上有这些CheckBox,那么您可以将它们添加到数组(或List,这将更容易做到):
List<CheckBox> checkBoxesList = new List<CheckBox>();
foreach (Control ctrl in FormName.Controls)
{
if (ctrl.GetType() == typeof(CheckBox))
{
checkBoxesList.Add(ctrl as CheckBox);
}
}
记住,只需写下:
checkBox1
,checkBox2
不能让它们像checkBox[0]
那样 - 它不是一个阵列,它只是一个名字,而不是#1;&#39; 1&#39;或者&#39; 2&#39;最后。