#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. Единственный дополнительный бит — это математика для координат, которая довольно незначительна.