#c# #winforms
#c# #winforms
Вопрос:
У меня есть цикл for, который я пытаюсь использовать для создания и размещения содержимого формы.
Это то, до чего я дошел до сих пор:
public void RefreshSkillDialog()
{
Point nPt = new Point(25, 25);
for (int x = 0; x < Enum.GetNames(typeof(Character.Skill)).Length; x )
{
GenerateFields(x,nPt);
Console.Write(this.Controls.Count "n");
Console.WriteLine(this.Controls[x].ToString() "n");
}
}
public void GenerateFields(int it, Point pt)
{
Label tLbl = new Label();
tLbl.Location = new Point(pt.X (it * _vSpace), pt.Y);
tLbl.Name = Enum.GetName(typeof(Character.Skill), it);
tLbl.Text = this.Controls.Count.ToString();
this.Controls.Add(tLbl);
}
_vSpace — это целое число, инициализированное 10 в конструкторе.
Результатом этого кода является:
Я думал, что проблема заключается в повторном использовании переменной tLbl, но, насколько я могу судить, она должна работать нормально, поскольку я повторно инициализирую ее в начале каждой итерации.
Комментарии:
1. Каков результат
Enum.GetNames(typeof(Character.Skill)).Length
?2. Возвращаемое значение — это количество значений в счетчике навыков. На данный момент длина возвращается как три.
Ответ №1:
При создании новой Label
формы по умолчанию ее ширина составляет 100 пикселей.
Вы меняете местоположение (координату x) каждого нового Label
, но недостаточно. Каждый новый Label
элемент перекрывает предыдущий, так что он закрывает текст.
Вы можете исправить это, установив AutoSize = true
на каждом Label
:
Label tLbl = new Label();
tLbl.AutoSize = true;
...
Или путем изменения его размера, чтобы он был не таким широким:
Label tLbl = new Label();
tLbl.Size = new Size(10, 23);
...
Вы также можете рассмотреть возможность просто использовать a FlowLayoutPanel
, поскольку он будет обрабатывать макет за вас. Добавляйте в него каждый новый элемент управления и не утруждайте себя установкой a Location
.
Label tLbl = new Label();
tLbl.Name = Enum.GetName(typeof(Character.Skill), it);
tLbl.Text = flowLayoutPanel1.Controls.Count.ToString();
flowLayoutPanel1.Controls.Add(tLbl);
Если вы это сделаете, вам также придется изменить свой Console.WriteLine
оператор в другом методе:
Console.WriteLine(flowLayoutPanel1.Controls[x].ToString() "n");
Комментарии:
1. Предоставьте мне упускать из виду что-то такое тривиальное. Спасибо, что нашли время. В качестве будущей ссылки, это происходит потому, что метки непрозрачны?