我想基于数组创建标签,但我总是只获得一个标签。
private void button1_Click(object sender, EventArgs e)
{
Debug.WriteLine(hardrive.GetHardDriveName.Count);
Label[] lblHDDName = new Label[hardrive.GetHardDriveName.Count];
for (int i = 0; i < hardrive.GetHardDriveName.Count; i++)
{
int x = 10;
int y = 10;
lblHDDName[i] = new Label();
lblHDDName[i].Location = new System.Drawing.Point(x, y);
lblHDDName[i].Text = "Test";
groupBoxHDD.Controls.Add(lblHDDName[i]);
y += 10;
}
}
调试
Debug.WriteLine(hardrive.GetHardDriveName.Count);
显示数组中的两个项目。
问题是在GroupBox中只有一个标签而不是两个。
答案 0 :(得分:5)
您的y
变量在for循环中定义,而不是在外部。因此,对于循环的每次执行,您将其初始化为10
并在System.Drawing.Point
中使用它。如果要跟踪循环结束时的增量,必须在for循环之前声明并初始化y
。
int y = 10;
for (int i = 0; i < ...; i++)
{
// use y
...
// increment it
y += 10;
}
答案 1 :(得分:1)
您在循环的每次迭代开始时将y重置为10.
将x和y的声明移到循环之外。
这样:
for (int i = 0; i < hardrive.GetHardDriveName.Count; i++)
{
int x = 10;
int y = 10;
....
应该是:
int x = 10;
int y = 10;
for (int i = 0; i < hardrive.GetHardDriveName.Count; i++)
{
....
答案 2 :(得分:1)
不,你正在创造所有正确的标签 - 但他们都有相同的位置(10,10)。如果你想看到不止一个,你需要将它们放在不同的地方:)要么在循环外声明y
,要么只使用:
lblHDDName[i].Location = new Point(10, i * 10 + 10);
您可能希望查看某些描述的自动排列控制,而不是对位置进行硬编码。
此外,看起来你根本不需要标签数组 - 之后你就不再使用它们了。例如,您可以:
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < hardrive.GetHardDriveName.Count; i++)
{
// Assuming you're using C# 3 or higher
Label label = new Label {
Location = new Point(10, i * 10 + 1),
Text = "test"
};
groupBoxHDD.Controls.Add(label);
}
}
甚至:
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < hardrive.GetHardDriveName.Count; i++)
{
groupBoxHDD.Controls.Add(new Label {
Location = new Point(10, i * 10 + 1),
Text = "test"
});
}
}
答案 3 :(得分:1)
移动
int x = 10;
int y = 10;
out for for for循环
答案 4 :(得分:1)
您遇到的一个问题是x
和y
声明在循环内部,因此y
始终 10 即使您添加10在循环结束时它。标签将始终处于相同位置。要在for循环之外修复此移动int y = 10
。你也应该在那里移动int x = 10
。
答案 5 :(得分:0)
移动
int x=10;
int y=10;
在循环之外
并将y增加30
if(您希望标签与起点对齐
)int x=10;
可以保留在循环中
int x = 10;
for (int i = 0; i < hardrive.GetHardDriveName.Count; i++)
{
int y = 10;
lblHDDName[i] = new Label();
lblHDDName[i].Location = new System.Drawing.Point(x, y);
lblHDDName[i].Text = "Test";
groupBoxHDD.Controls.Add(lblHDDName[i]);
y += 30;
}