开发者

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;
    }
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜