Программная вставка элементов управления в форму

#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. Предоставьте мне упускать из виду что-то такое тривиальное. Спасибо, что нашли время. В качестве будущей ссылки, это происходит потому, что метки непрозрачны?