在运行时向表单添加C#标签

时间:2012-12-06 04:18:04

标签: c# winforms

我正在尝试用C#制作一个简单的基于文本的游戏。我想要实现这一点是通过向表单添加标签(而不是使用命令提示符)。我在将它们添加到屏幕时遇到了一些麻烦。 Visual Studio提供了一个未指定的错误(仅表示我有一个未处理的异常):

  

对象引用未设置为对象的实例

当我尝试使用数组用这些标签填充屏幕时。代码:

private void Main_Game_Load(object sender, EventArgs e)
{
    Label[] Enemies = new Label[20];
    Label[] Projectile = new Label[5];
    Font font = new Font(new System.Drawing.FontFamily("Microsoft Sans Serif"), 12);
    Random rand = new Random();
    Point point = new Point(rand.Next(500), rand.Next(500));

    for (int i = 0; i < Enemies.Length; i++)
    {
        Enemies[i].Text = "E";
        Enemies[i].Font = font;
        Enemies[i].BackColor = ColorTranslator.FromHtml("#000000");
        Enemies[i].Location = point;
        Enemies[i].Size = new Size(12, 12);
        Enemies[i].Name = "Enemy"+i.ToString();
        this.Controls.Add(Enemies[i]);
    }
}

我想知道这个问题可能隐藏在哪里?我用谷歌搜索了它,我的代码似乎应该可以工作(除了现在点不会随意尝试填充)。

2 个答案:

答案 0 :(得分:3)

这行代码创建一个空数组(即每个引用任何内容的元素),最多可存储20个标签:

Label[] Enemies = new Label[20];

您必须明确地在数组中创建每个标签:

for (int i = 0; i < Enemies.Length; i++)
{
    //creates a new label and stores a reference to it into i element of the array 
    Enemies[i] = new Label(); 
    //...
}

来自Single-Dimensional Arrays (C# Programming Guide)

SomeType[] array4 = new SomeType[10];
  

此语句的结果取决于SomeType是否为值   类型或引用类型。如果它是值类型,则语句创建   一个包含10个元素的数组,每个元素都具有SomeType类型。如果   SomeType是引用类型,该语句创建一个10的数组   元素,每个元素都被初始化为空引用。

答案 1 :(得分:2)

创建数组时,将使用该类型的默认值填充所有元素。对于null的所有引用类型。您需要为数组中的每个项目实际创建一个新的Label

for (int i = 0; i < Enemies.Length; i++)
{
    Enemies[i] = new Label();
    //...