Работа с массивом контроллов

Господа, прошу объяснить мне как незнающему\непонимающему. Есть форма, на ней туча контроллов, ради оптимизации процесса хочу создать массив контроллов, причем так:
private void button2_Click(object sender, EventArgs e)
 {
 Label[] lbl=new Label[7];
 for (int i = 1; i < lbl.Length; i++)
 {
 lbl[i]=new Label();
 lbl[i].Text ="label" + Convert.ToString(i);
 help2(lbl[i]);
 }
 }
Принцип взят из FAQа. Здесь проблема в аттаче к старым контроллам новоявленных. До этого использов свой способ
(Label)Convert.ChangeType(str, typeof(Label));
Здесь вместо str циклически подставляются названия для label (label1, label2, etc). В обоих способах программа компилируется нормально, во втором ругается при попытке выполнения. Повторюсь, прошу объяснить\рассказать, как правильно. С уважением, Виктор.
4 ответа

ради оптимизации процесса хочу создать массив контроллов
особого смысла в массиве не вижу создавайте их динамически с уникальными именами, навешивайте обработчики и пользуйтесь следующий код прояснит, что я имею ввиду
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
 
namespace WindowsFormsApplication
{
    public partial class program : Form
    {
    
        [STAThread]
        static void Main()
        {
            Application.Run(new program());
        }
        Button ButAdd = new Button();
        Button ButXZ = new Button();
        int z = 0;
        public program()
        {
            ButAdd.Parent = this;
            ButAdd.Bounds = new Rectangle(0,(z++)*20,80,20);
            ButAdd.Text = "Add";
            ButAdd.Click += new EventHandler(ButAdd_Click);
            ButXZ.Parent = this;
            ButXZ.Bounds = new Rectangle(0, (z++) * 20, 80, 20);
            ButXZ.Click += new EventHandler(ButXZ_Click);
            ButXZ.Name = "";
        }
 
        void ButXZ_Click(object sender, EventArgs e)
        {
            try
            {
                this.Controls[z - 2].Text = "Old №" + this.Controls[z - 2].Name[this.Controls[z - 2].Name.Length - 1];
                this.Controls[z - 2].Name = "Old №" + this.Controls[z - 2].Name[this.Controls[z - 2].Name.Length - 1];
                foreach (Control y in this.Controls)
                    if (y.Text.Substring (0,3)  == "Add")
                        y.Text += (z-1).ToString ();
            }
            catch { };
        }
 
        void ButAdd_Click(object sender, EventArgs e)
        {
            Button New = new Button();
            New.Parent = this;
            New.Bounds = new Rectangle(0, (z++) * 20, 80, 20);
            New.Text = "NewButton"+z.ToString ();
            New.Name = "New №" + z.ToString();
            New.Click += new EventHandler(NewBut_Click);
        }
 
        void NewBut_Click(object sender, EventArgs e)
        {
            Button temp=(Button)sender;
            MessageBox.Show(temp.Name);
        }
    }
}


Вариант принят, сейчас в обработке. Уточню начальное условие: есть форма, на ней уже 36 связок Textbox+Label. Чтобы не создавать их с нуля(как предложенные динамически создаваемые контролы), есть ли вариант их использовать(прицепиться) к ним?Зы: Для чего это вообще необходимо:
        public void help2(Label lbl)
        {
            string str1,str2,str2_1,str3,str4;
            str1 = lbl.Text;//Каждый label имеет свой уникальный текст.
            _mainform.help1(fltxt,0);//fltxt-текстовый файл, 0-занесение в richtextbox2
            str2 = lbl.Name;
            if (str2.Length == 6) str2_1 = str2.Substring(5, 1);
            else if (str2.Length == 7) str2_1 = str2.Substring(5, 2);
            else str2_1 = "Hello";
            str3 = "textbox" + str2_1;
            _mainform.help4((TextBox)Convert.ChangeType(str3, typeof(TextBox)));
        }
Пример кода в файле-помощнике:
Год=ГодДох //Соответственно, Label1.Text="Год", значение ГодДох используется уже в дальнейших расчетах.
Сотрудник=НомСпр
Дата=ДатаСпр
Таким образом, обращаясь к файлу помощнику, мы получаем значение имени контейнера в XML-файле, причем в сам контейнер необходимо занести значения, введенные в связанный с label textbox.


есть ли вариант их использовать(прицепиться) к ним?
        Label[] lbl=new Label[7];
        private void button2_Click(object sender, EventArgs e)
        {
            int j = 0;
            foreach (Control z in this.Controls)
                if (z.GetType().ToString() == "System.Windows.Forms.Label")//или switch
                    lbl[j++] = (Label)z; 
            MessageBox.Show("Добавлено - "+j.ToString());
            Label label3 = new Label();
            label3.Parent = this;
            label3.Bounds = new Rectangle(0,0,50,20);
            label3.Text = "label3";
            lbl[j++] = label3;
            MessageBox.Show("Добавлено - " + j.ToString());
        }
может так?


Используя данный метод, выскакивает ошибка: