Create labels from array
I want to create labels based on an array, but i always get only one label.
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;
}
}
Debugging
Debug.WriteLine(hardrive.GetHardDriveName.Count);
Shows two items in the array.
The problem is that in the GroupBox there is only one label instead of two.
Your y
variable is defined in the for loop, not outside. Therefore, for each execution of the loop, you initialize it to 10
and use it in your System.Drawing.Point
. If you want to keep track of the increment done at the end of the loop, you must declare and initialize y
before the for loop.
int y = 10;
for (int i = 0; i < ...; i++)
{
// use y
...
// increment it
y += 10;
}
You're resetting y back to 10 at the start of each iteration of the loop.
move the declaration of x and y outside of the loop.
this:
for (int i = 0; i < hardrive.GetHardDriveName.Count; i++)
{
int x = 10;
int y = 10;
....
should be:
int x = 10;
int y = 10;
for (int i = 0; i < hardrive.GetHardDriveName.Count; i++)
{
....
Nope, you're creating all the right labels - but they've all got the same position of (10, 10). If you want to see more than one of them, you'll need to put them in difference places :) Either declare y
outside the loop, or simply use:
lblHDDName[i].Location = new Point(10, i * 10 + 10);
Rather than hard-coding the positions, you may want to look into an auto-arranging control of some description.
Also, it looks like you don't really need the array of labels at all - you're not using them afterwards. For example, you could have:
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);
}
}
or even:
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"
});
}
}
move the
int x = 10;
int y = 10;
out of the for loop
One of the problems you have is that the x
and y
declarations are inside the loop so y
will always be 10 even though you add 10 to it in the end of the loop. The labels will always be in the same position. To fix this move int y = 10
outside of the for loop. You should move int x = 10
there as well.
move
int x=10;
int y=10;
outside the loop
and increment y by 30
if( you want the labels to align themselves to their starting point
int x=10;
can remain inside the loop
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;
}
精彩评论