Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 我不能';t改变16*16标签矩阵中对角线的颜色。什么';我的问题是什么?_Vb.net_Matrix - Fatal编程技术网

Vb.net 我不能';t改变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

当我启动程序时,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 = 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
变量没有任何用途-它只能引用一个标签-但在该循环中创建了一组对象。这不是很有帮助。说“它不起作用”并不能给我任何信息来帮助你解决你的问题。这对我来说很好。我只是将代码复制到一个测试项目中,效果很好。