【问题标题】:How can I create labels inside a For loop如何在 For 循环中创建标签
【发布时间】:2011-08-24 05:05:19
【问题描述】:
private ArrayList label= new ArrayList(30);

Label label_class = new Label();
Random r = new Random();

for (int i = 0; i < label.Count; i++) {
    ((Label)label[i]).Location = new Point(r.Next(ClientRectangle.Right -10),
                                           r.Next(ClientRectangle.Bottom - 10));
    ((Label)label[i]).Text = "o";
    ((Label)label[i]).Click += new EventHandler(Form1_Load);

    this.Controls.Add((Label)label[i]);

    ((Label)label[i]).Show();
}

这个 for 循环位于 Form1_Load 内,因此它会在表单加载时运行。 问题是,当我断点时,我看到断点没有注意到 forloop 内的代码/没有运行。这是为什么??以及如何创建许多随机放置在form1(window form)上的标签

【问题讨论】:

  • 忘记提问了.... private ArrayList label= new ArrayList(30);分数分数 = 新分数();标签 label_class= 新标签();随机 r = new Random();
  • 编辑您的问题并将代码放入其中...然后点击 {} 按钮以正确格式化您的代码。

标签: c#


【解决方案1】:

问题出在

private ArrayList label= new ArrayList(30);

这会创建一个大小为 30 的ArrayList,而不是一个包含 30 个元素的ArrayList

如果你这样做

List<Label> labels = new List<Label>();

for (int i = 0; i < 30; i++) {
    var temp = new Label();

    temp.Location = new Point(r.Next(ClientRectangle.Right -10),
                                       r.Next(ClientRectangle.Bottom - 10));
    temp.Text = "o";
    temp.Click += new EventHandler(Form1_Load);

    temp.BackColor = System.Drawing.Color.White;

    this.Controls.Add(temp);

    temp.Show();
    labels.Add(temp) 
}

它应该可以工作。

此外,请注意我使用 List&lt;Label&gt; 而不是 ArrayList 在某些情况下,您希望能够指定要取出的对象,但通常(在这种情况下)是您使用的通用形式指定类型会确保你更好。你不需要做所有你正在做的拳击,你会写更少的代码行,所有这些都将更具可读性。

【讨论】:

  • 什么是var??无论如何thanx它的工作!现在我想知道它是如何工作的!谢谢你!
  • hmmm 如何使所有标签的背景颜色为白色?我正在尝试制作一个没有 AI 幽灵的吃豆人游戏
  • var 是 C# 3.0 中添加的一项功能,它允许编译器为您确定变量的类型,而不是您指定它。当类型很明显时,例如本例,它有助于使代码具有可读性和可扩展性。
  • Joe - 查看白色着色的修正答案
【解决方案2】:

线

private ArrayList label= new ArrayList(30);

不会创建包含 30 个项目的 ArrayList。它构造了一个初始容量为 30 的 ArrayList,但仍然没有项目(请参阅文档 here)。 for 循环未运行,因为 label.Count 为零。

考虑将其更改为类似

private ArrayList label = new ArrayList();
for (int i = 0; i < 30; i++) label.Add(new Label(...));

接下来是您的其余代码。

【讨论】:

    【解决方案3】:

    这里真的有两个问题:

    1. 为什么你的断点没有被命中
    2. 此代码是否有效。

    首先,更改代码而不是使用 ArrayList

    private List<Label> label= new List<Label>();
    

    而且你可以在整个地方阻止丑陋的演员。您还需要将 label.Count 更改为 30。

    其次,没有命中断点几乎总是表明您的调试信息与您的代码不同步,或者调试器找不到您的 PDB(调试信息)文件。

    确保您使用的是调试版本。查看以下内容: breakpoints in code behind not hit 另请参阅我的博客以检查有关告诉 VS 加载 PDB 文件的部分中是否加载了符号(如果清理等不适用于您的解决方案,但它应该!)

    http://completedevelopment.blogspot.com/2009/11/debugging-in-gac-all-ways-to-accomplish.html

    【讨论】:

      猜你喜欢
      • 2023-02-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 1970-01-01
      • 2021-11-27
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多