Как мне динамически называть метки ссылок?

#c# #winforms

#c# #winforms

Вопрос:

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

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

 for (int i = 0; i < 205; i  )
{
    if (LinkLabel#   i.Text == "name")
    {
        // do stuff

    }
}
 

Комментарии:

1. Сохраните их в массиве и ссылайтесь на них по индексу (например LinkLabel[] yourLabels , для последующего использования yourLabels[i] ).

2. у меня 205 меток, нет ли более простого способа?

3. Как вы создаете метки? Если вы буквально помещаете их все в конструктор, вы усложняете себе жизнь с самого начала. Если вы создаете их динамически в коде, то нет — хранить их в массиве (или в любой структуре по вашему выбору) не только безопаснее, чем находить их по имени (на случай, если что-то изменится), но и должно быть очень просто настроить.

4. хм … не видел этого подхода к созданию меток, но разве мне не нужно делать этот код самостоятельно для каждой из них? code this.linkLabel76.AutoSize = true; this.linkLabel76. Местоположение = новая система. Рисование. Точка (435, 537); this.linkLabel76.Name = «linkLabel76»; this.linkLabel76. Размер = новая система. Рисование. Размер (61, 13); this.linkLabel76. TabIndex = 141; this.linkLabel76. TabStop = true; this.linkLabel76. Текст = «linkLabel76»;

Ответ №1:

Вы можете искать элементы управления в форме по имени, чтобы получить ссылку на них.

LinkLabel ll = (LinkLabel)this.Controls["LinkLabel" i];

Это может вызвать исключения, хотя, если приведение завершается неудачно или элемент управления не найден.

Более безопасным способом было бы использовать сопоставление с образцом:

 if (this.Controls["LinkLabel"   i] is LinkLabel ll)
{
    // do stuff with ll
}
 

Ответ №2:

Другой подход (предложенный @Broots Waymb) заключается в динамическом создании элементов управления метками ссылок и добавлении их в форму. Вот пример кода, который я адаптировал из другого кода, который я уже использую. (не проверено, но похоже, что это должно сработать)

     /// <summary>
    /// List for storing references to the LinkLabels
    /// </summary>
    List<LinkLabel> m_LinkLabels = new List<LinkLabel>();

    /// <summary>
    /// Creates and places all the LinkLabels on the form
    /// </summary>
    private void CreateLinkLabels()
    {
        int startingX = 100;        // starting top left X coordinate for first link label
        int startingY = 100;        // starting top left Y coordinate for first link label
        int xOffset = 20;           // horizontal space between labels
        int yOffset = 20;           // vertical space between labels
        int labelsToCreate = 100;   // total number of labels to create
        int labelsPerRow = 10;      // number of labels in each row
        int labelWidth = 61;        // width of the labels
        int labelHeight = 13;       // height of the labels

        int labelsInCurrentRow = 0; // number of labels in the current row
        int x = startingY;          // current x coordinate
        int y = startingX;          // current y coordinate
        int tabIndexBase = 65;      // base number for tab indexing 

        for (int i = 0; i < labelsToCreate; i  )
        {
            // update coordinates for next row
            if (labelsInCurrentRow == labelsPerRow)
            {
                x = startingX;
                y  = yOffset;
                labelsInCurrentRow = 0;
            }
            else
            {
                x  = xOffset;
                labelsInCurrentRow  ;
            }

            // create the label
            LinkLabel ll = new LinkLabel()
            {
                Name = "LinkLabel"   (i   1), //  1 to correct zero based index
                AutoSize = true,
                Location = new System.Drawing.Point(x, y),
                Size = new System.Drawing.Size(labelWidth, labelHeight),
                TabIndex = tabIndexBase   i,
                TabStop = true,
                Text = "LinkLabel"   (i   1) //  1 to correct zero based index
            };

            // add the label to the list
            m_LinkLabels.Add(ll);
        }

        // add all controls in the list to the form
        this.Controls.AddRange(m_LinkLabels.ToArray());
    }
 

Комментарии:

1. это отличная идея, но не тяжелее ли для процессора, чем создание, подумал дизайнер?

2. Не совсем. Дизайнер в любом случае выполняет большую часть этой работы, она просто подробно изложена в файле .designer.cs. Единственный дополнительный бит — это математика для координат, которая довольно незначительна.