Vb.net 我不能';t改变16*16标签矩阵中对角线的颜色。什么';我的问题是什么?
当我启动程序时,16*16矩阵出现在我的屏幕上。但当我点击对角线按钮时,对角线不是红色的。这并没有改变 我的代码:Vb.net 我不能';t改变16*16标签矩阵中对角线的颜色。什么';我的问题是什么?,vb.net,matrix,Vb.net,Matrix,当我启动程序时,16*16矩阵出现在我的屏幕上。但当我点击对角线按钮时,对角线不是红色的。这并没有改变 我的代码: Public Class Form1 Dim etk As New Label 'i define the matrix as etk Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load For i
Public Class Form1
Dim etk As New Label 'i define the matrix as etk
Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
For i = 0 To 15
For j = 0 To 15
Dim etk As New Label
Me.Panel.Controls.Add(etk)
etk.Name = i
etk.Tag = j
etk.Size = New Size(26, 26)
etk.BackColor = Color.Black
etk.Location = New Point(30 * i + 10, 30 * j + 10)
Next
Next
End Sub
Private Sub diagonal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Timer1.Enabled = True
For i = 0 To 15
For j = 0 To 15
etk.Name = i
etk.Tag = j
If i = j Then
etk.BackColor = Color.Red
End If
Next
Next
End Sub
End Class
感谢您的关注。首先,动态加载标签的名称不是唯一的。您需要连接x和y以使其唯一:
For i = 0 To 15
For j = 0 To 15
Dim etk As New Label
Me.Panel.Controls.Add(etk)
etk.Name = i & "," & j
etk.Tag = j
etk.Size = New Size(26, 26)
etk.BackColor = Color.Black
etk.Location = New Point(30 * i + 10, 30 * j + 10)
Next
Next
然后,在单击事件中循环时,需要按名称查找现有标签。仅在现有标签上设置name属性对查找控件没有任何作用。所做的只是改变已经存在的一个。要按名称查找控件,可以使用名称作为控件
属性的键值进行查找:
For i = 0 To 15
For j = 0 To 15
If i = j Then
Dim etk As Control = Me.Panel.Controls(i & "," & j)
etk.BackColor = Color.Red
End If
Next
Next
或者,更简单地说:
For i = 0 To 15
Dim etk As Control = Me.Panel.Controls(i & "," & i)
etk.BackColor = Color.Red
Next
这一切都与范围有关。新的表单加载创建了一个新标签——它不是您在表单级别声明的标签(因为它是新的)。新建和
Dim/Private
并不总是自动同时进行Dim/Private
声明对象变量,在表单级别使用该变量<代码>新建创建一个新实例,将其从表单加载中删除。由于您在循环中创建了一个束,表单级别1将只引用最后一个-而是从控件集合中获取控件,或者将它们保存到(标签)列表中为什么?这看起来很难达到目的。你能告诉我更多的信息吗@puropoix想说的是你声明了两个不同的etk
变量。一个是字段(“表单级别”字段),另一个是在For
循环中声明的局部变量。在for循环中引用etk
变量的代码将被解释为引用局部变量,因为在该范围内,该局部变量将覆盖表单级别1。循环之外的代码将引用表单级别1。在任何情况下,正如Proputix所说,对象和变量是两个不同的东西。您的代码创建了257个Label
对象,即使它只声明了两个变量。表单级别变量的声明包含一个New
子句,它会导致创建一个新的标签
对象,即使它从未显示过。For
循环创建另一个256个Label
对象,即使它在任何给定时间只有一个变量引用其中一个对象。表单级别的etk
变量没有任何用途-它只能引用一个标签-但在该循环中创建了一组对象。这不是很有帮助。说“它不起作用”并不能给我任何信息来帮助你解决你的问题。这对我来说很好。我只是将代码复制到一个测试项目中,效果很好。