Могу ли я использовать массивы элементов управления WinForm без суеты трусов VS? - PullRequest
0 голосов
/ 24 апреля 2011

У меня есть сетка этикеток. Чтобы получить к ним доступ с программной точки зрения, я изменил их с:

gridLabel1
gridLabel2
...
gridLabelN

Кому:

gridLabel[0]
gridLabel[1]
...
gridLabel[N-1]

Но теперь дизайнер жалуется, что

Переменная gridLabel либо необъявлена, либо никогда не назначалась.

Несмотря на то, что я тоже это изменил:

private System.Windows.Forms.Label gridLabel1 = new System.Windows.Forms.Label;
private System.Windows.Forms.Label gridLabel2 = new System.Windows.Forms.Label;
...
private System.Windows.Forms.Label gridLabelN = new System.Windows.Forms.Label;

Кому:

private System.Windows.Forms.Label[] gridLabel = new System.Windows.Forms.Label[N];

Что я пропустил?

Ответы [ 3 ]

3 голосов
/ 24 апреля 2011

Не связывайтесь с сгенерированным кодом самостоятельно. Файл designer.cs должен управляться самим дизайнером форм, а не пользователем. В частности, легко проверить, что разработчик не переносит процедуру, которую вы, похоже, выполняете:

  1. Объявление поля массива элементов управления в файле конструктора.
  2. Использование этого поля для заполнения коллекции элементов управления формы путем изменения сгенерированного метода InitializeComponent.

Когда я это делаю, я получаю ту же ошибку, что и вы.

Обычным решением для такого рода требований является использование программной техники для добавления ряда элементов управления в коллекцию элементов управления родительского элемента управления. В идеале, создайте свой собственный пользовательский элемент управления, который может содержать число Labels (которое заполняется программно). Затем вы можете использовать этот элемент управления в вашей форме с полной поддержкой дизайнера.

EDIT

Например (только эскиз, без пользовательского элемента управления), добавьте FlowLayoutPanel к форме через конструктор.

Затем измените конструктор формы на:

public MyForm()
{
    InitializeComponent();

    var labels = Enumerable.Range(0, 100)
                           .Select(i => new Label { Text = i.ToString() })
                           .ToArray();

    flowLayoutPanel1.Controls.AddRange(labels);
}

Очевидно, что такое решение может не подходить, если вы не хотите, чтобы метки были организованы в макет потока.

1 голос
/ 24 апреля 2011

Создайте массив меток после вызова InitializeComponent и заполните его сгенерированными дизайнером экземплярами, например:

Label[] labels;

MyControl() {
  InitializeComponent();
  labels = new[] { label1, label2, label3 };
}

Это позволит вам сохранить функциональность дизайнера и получить к ним доступ последовательно.

0 голосов
/ 24 апреля 2011

Вы пытаетесь динамически создавать ярлыки? Или вы пытаетесь получить доступ к нескольким статическим меткам?

Для первого случая у вас остается ручное создание и манипуляция за пределами конструктора. Так же, как предлагает Ани.

Во втором случае вы можете получить элементы управления на основе имени из Form.Controls collection. Это имя может содержать индекс меток. Затем вы можете создать метод или индексатор для возврата определенной метки на основе индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...