首页 > 解决方案 > 在 C# 中,如何访问在运行时创建的一组控件标签的元素?

问题描述

多年来,我用各种形式的 BASIC 进行了大量编程,包括 Visual Basic。说到C#,我很困惑。下面是我在 C# 中创建的 mastermind 程序的表单加载代码。一切正常,直到我尝试创建我的标记程序。

 public void Form1_Load(object sender, EventArgs e)
    {
        //int columns = 14;
        Label[,] board = new Label[5,14];
        for (int i = 0; i < 5; i++)
        {
            for (int j = 0; j < 14; j++)
            {
                board[i,j] = new Label();
                board[i,j].AutoSize = false;
                board[i,j].Size = Dummy.Size;
                board[i,j].BorderStyle = BorderStyle.Fixed3D;
                board[i,j].BackColor = Color.Beige;
                board[i,j].Location = new Point(i * Dummy.Width+2, j * Dummy.Height+2);
                board[i,j].Name = "board" + i.ToString() + "," + j.ToString();
                board[i,j].Width = Dummy.Width - 4;
                board[i,j].Height = Dummy.Height - 4;
                board[i,j].TabIndex = 0;
                //board[i][j].Text = i.ToString() +" "+ j.ToString();
                panel2.Controls.Add(board[i,j]);
                board[i,j].Click += new EventHandler(Label1_Click);
            }        
            P2.Click += new EventHandler(P1_Click);
            P3.Click += new EventHandler(P1_Click);
            P4.Click += new EventHandler(P1_Click);
            P5.Click += new EventHandler(P1_Click);
            P6.Click += new EventHandler(P1_Click);
            P7.Click += new EventHandler(P1_Click);
            P8.Click += new EventHandler(P1_Click);
        }
        int marker = 14;
        int each = 5;
        Label[,] mark = new Label[each,marker];
        // Instantiating all the buttons in the array
        for (int i = 0; i < each; i++)
        {
            for (int j = 0; j < marker; j++)
            {
                mark[i, j] = new Label();
                mark[i, j].AutoSize=false;
                mark[i, j].Size = Minnie.Size;
                mark[i, j].BorderStyle = Minnie.BorderStyle;
                mark[i, j].BackColor = Color.Blue;
                mark[i, j].Left = i * (Minnie.Width+2)+3;
                mark[i, j].Top = j * Dummy.Height+10;
                panel3.Controls.Add(mark[i, j]);
            }
        }
    }

这会在面板 2 和 3 中分别创建用于猜测的游戏“洞”和较小的标记“洞”。播放部分工作正常,因为我有一个选择面板,允许用户选择颜色,然后通过单击板孔阵列“放置”颜色。各种颜色与我在单击它们时附加到板元素的 .Tag 的数字相匹配。当我尝试阅读 .Tags 来评估标记的猜测时,困难就来了。这是不起作用的代码:

    public void button1_Click(object sender, EventArgs e)
    {
        int r;
        for (r=0;r<5;r++) {
            textBox1.Text = textBox1.Text + board[0,r].Tag;
            //board[0, r].BackColor = Color.Azure;
        }
    }

棋盘[0, r].BackColor = Color.Azure; 试图隔离错误的来源。它产生了相同的错误,因此按钮例程似乎知道“板”存在但不承认或无法访问下标元素。产生的错误是:

▶ $exception {"对象引用未设置为对象的实例。"} System.NullReferenceException

为了克服这个困难,我需要做什么?

提前致谢,

凸轮

标签: c#

解决方案


每个变量都有一个作用域:该变量有效的代码部分。如果在方法中定义它,则该变量只能在该方法中使用。

因此,在这种情况下,如果您想在多个方法中使用该变量,则需要在包含这些方法的范围内声明。在这种情况下,这就是你的Form1类——所以就在类的声明之内,但在任何方法之外。

但是你也需要删除里面的声明Form1_Load,否则你最终会得到两个具有相同名称和不同范围的变量。它们可能具有相同的名称,但它们将引用内存中的两个不同位置并且不会保存相同的数据。当你使用boardinside时Form1_Load,你将引用在该方法中声明的那个,并且一旦方法完成它就会被销毁。


推荐阅读