将控件以编程方式插入表单

时间:2014-06-16 23:54:20

标签: 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的整数。

此代码的结果是:

result of code

我认为问题在于重用tLbl变量,但据我所知,它应该可以正常工作,因为我在每次迭代开始时重新初始化它。

1 个答案:

答案 0 :(得分:4)

创建新的Label时,默认情况下为100px宽。

您正在更改每个新Label的位置(x坐标),但不够。每个新的Label都与前一个AutoSize = true重叠,这样就会覆盖文本。

您可以通过在每个Label上设置Label tLbl = new Label(); tLbl.AutoSize = true; ... 来解决此问题:

Label tLbl = new Label();
tLbl.Size = new Size(10, 23);
...

或者通过调整大小以使其不那么宽:

FlowLayoutPanel

您可能还会考虑使用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}}