【问题标题】:Create labels from array从数组创建标签
【发布时间】:2011-06-27 14:51:12
【问题描述】:

我想根据数组创建标签,但我总是只得到一个标签。

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 中只有一个标签而不是两个。

【问题讨论】:

    标签: c# winforms arrays label


    【解决方案1】:

    您的 y 变量是在 for 循环中定义的,而不是在外部。因此,对于循环的每次执行,将其初始化为10 并在System.Drawing.Point 中使用它。如果要跟踪循环结束时完成的增量,则必须在 for 循环之前声明并初始化 y

    int y = 10;
    for (int i = 0; i < ...; i++)
    {
       // use y
       ...
    
       // increment it
       y += 10;
    }
    

    【讨论】:

      【解决方案2】:

      您在循环的每次迭代开始时将 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++)
      {    
          ....
      

      【讨论】:

        【解决方案3】:

        不,您正在创建所有正确的标签 - 但它们的位置都相同 (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"
                });
            }
        }
        

        【讨论】:

          【解决方案4】:

          移动

          int x = 10;
          int y = 10;
          

          退出for循环

          【讨论】:

            【解决方案5】:

            您遇到的一个问题是 xy 声明位于循环内,因此 y 将始终为 10,即使您在其末尾添加了 10循环。标签将始终位于相同的位置。要在 for 循环之外修复此移动 int y = 10。您也应该将int x = 10 移到那里。

            【讨论】:

              【解决方案6】:

              移动

              int x=10;
              int y=10;
              

              在循环之外

              并将 y 增加 30

              如果(您希望标签与起点对齐

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2019-05-06
                • 2019-10-17
                • 1970-01-01
                • 2020-08-16
                • 1970-01-01
                • 2010-12-08
                • 2019-09-20
                • 2011-07-08
                相关资源
                最近更新 更多