Использование динамического имени переменной в C # для WinForms - PullRequest
5 голосов
/ 11 августа 2010

Не уверен, что это лучший способ сказать это, но мне интересно, можно ли получить доступ к имени динамической переменной в C # (3.5).

Вот код, который я сейчас ищу, чтобы «улучшить» или сделать более элегантным с помощью цикла.

    private void frmFilter_Load(object sender, EventArgs e)
    {
        chkCategory1.Text = categories[0];
        chkCategory2.Text = categories[1];
        chkCategory3.Text = categories[2];
        chkCategory4.Text = categories[3];
        chkCategory5.Text = categories[4];
        chkCategory6.Text = categories[5];
        chkCategory7.Text = categories[6];
        chkCategory8.Text = categories[7];
        chkCategory9.Text = categories[8];
        chkCategory10.Text = categories[9];
        chkCategory11.Text = categories[10];
        chkCategory12.Text = categories[11];  


    }

Есть ли способ сделать что-то вроде ("chkCategory" + i.ToString ()). Текст?

Ответы [ 7 ]

6 голосов
/ 11 августа 2010

Да, вы можете использовать

  Control c = this.Controls.Find("chkCategory" + i.ToString(), true).Single();
  (c as textBox).Text = ...;

Добавьте некоторую проверку ошибок и оберните ее хорошим методом (расширение).


Редактировать: Возвращает Control[], поэтому в конце необходимы либо [0], либо .Single(). Добавлен.

5 голосов
/ 11 августа 2010
for(...)
{
     CheckBox c = this.Controls["chkCategory" + i.ToString()] as CheckBox ;

     c.Text = categories[i];  
}
2 голосов
/ 11 августа 2010

Вы можете сделать это с помощью отражения. Но не надо.

Правильнее создать экземпляр списка элементов управления, добавить их программно в форму и проиндексировать.

1 голос
/ 11 августа 2010

Иногда это может помочь поместить ваши элементы управления в массив или коллекцию следующим образом:

Checkbox[] chkCataegories = new Checkbox[] { chkCategory1, chkCategory2 ... };
for(int i = 0; i < chkCategories.Length; i++)
    chkCategories[i].Text = categories[i];

В качестве другого подхода вы можете динамически создавать свои флажки во время выполнения вместо времени проектирования:

for(int i = 0; i < categories.Length; i++)
{
    Checkbox chkCategory = new chkCategory { Text = categories[i] };
    someContainer.Controls.Add(chkCategory);
}

По крайней мере с динамически созданными элементами управления вам не нужно изменять графический интерфейс или код формы при добавлении новых категорий.

0 голосов
/ 29 февраля 2012

"this.Controls [" chkCategory "+ i.ToString ()]" и "this.Controls.Find (" chkCategory "+ i.ToString (), true)" оба не работают ... первыйинформирует вас, что содержимое [] не является целым числом, а последнее, что ControlCollection не содержит определения для Find.

Используйте «Control myControl1 = FindControl (" TextBox2 ");"вместо этого.

Мне нужна была эта форма, когда я перебирал другой массив, извлекал значения и использовал их для заполнения полей формы.Гораздо проще искать label1, label2, label3 и т. Д.

0 голосов
/ 11 августа 2010

Нет, но вы можете сделать что-то вроде этого (не проверено, остерегайтесь синтаксических ошибок):

private readonly CheckBox[] allMyCheckboxes = new CheckBox[] { chkCategory1, chkCategory2, ... }

Тогда вам просто нужно сделать

for (i = 0; i < 12; i++) allMyCheckboxes[i].Text = categories[i];
0 голосов
/ 11 августа 2010

Вам не нужна динамика для этого. Поместите chkCategory1 - 12 в массив и обведите его циклом for. Я бы посоветовал вам держать его в поле и инициализировать во время создания формы, потому что chkCategory, похоже, связан. Но если вы хотите простой пример того, как сделать это с помощью этого простого метода, то это будет примерно так:

private void frmFilter_Load(object sender, EventArgs e)
{
    var chkCategories = new [] { chkCategory1, chkCategory2, chkCategory3, .......... };
    for(int i = 0 ; i < chkCategories.Length ; i++ ) 
        chkCategoies[i].Text = categories[i];
}

Вы знаете больше о приложении, поэтому, возможно, вы могли бы избежать записи всех имен элементов управления - например, если они помещены в общий родительский элемент управления, то вы можете найти их, просмотрев его дочерние элементы.

...