c# - 在 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
为了克服这个困难,我需要做什么?
提前致谢,
凸轮
解决方案
每个变量都有一个作用域:该变量有效的代码部分。如果在方法中定义它,则该变量只能在该方法中使用。
因此,在这种情况下,如果您想在多个方法中使用该变量,则需要在包含这些方法的范围内声明。在这种情况下,这就是你的Form1
类——所以就在类的声明之内,但在任何方法之外。
但是你也需要删除里面的声明Form1_Load
,否则你最终会得到两个具有相同名称和不同范围的变量。它们可能具有相同的名称,但它们将引用内存中的两个不同位置并且不会保存相同的数据。当你使用board
inside时Form1_Load
,你将引用在该方法中声明的那个,并且一旦方法完成它就会被销毁。
推荐阅读
- javascript - 在 React 中添加外部 JavaScript 文件时出错
- c# - How do I get a value associated with a user model class property for login redirection with access token?
- c# - Attributes added by custom ModelMetadataProvider are not being considered in model-binding
- outlook - 如何在 Outlook 2016 和 2013 中删除额外的、不需要的填充?
- r - ggplot2 使用 ..count.. 来控制 geom_point 的大小
- javascript - React 和 laravel 混合:找不到模块'@babel/preset-react'
- javascript - 在后面的代码中将 JS 参数传递给 c# 函数-.net
- javascript - 无法读取 Express js 中未定义的属性“状态”
- json - 如何使用字符串以角度搜索 json 对象?
- android - WorkManager NetworkType.CONNECTED 在中国防火墙后面不起作用