使用C#中的for循环将复选框分配给复选框数组

时间:2014-09-01 11:58:03

标签: c# arrays loops for-loop checkbox

我想这样做:

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

但无论我尝试过什么 - 它都行不通。我希望你知道我的意思。 谢谢你的帮助!

3 个答案:

答案 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);
    }
}

记住,只需写下:
checkBox1checkBox2
不能让它们像checkBox[0]那样 - 它不是一个阵列,它只是一个名字,而不是#1;&#39; 1&#39;或者&#39; 2&#39;最后。