我有一个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变量,但据我所知,它应该可以正常工作,因为我在每次迭代开始时重新初始化它。
答案 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}}