VB.在TableLayoutPanel中使用和寻址按钮



嗨,我有这个TablelayoutPanel设置目前在我的程序中创建一个网格按钮,稍后将对应于特定的列和行:

'****INITIALISES TABLE LAYOUT INTO FORM******
    Dim ColCount, RowCount As Integer
    'Later change so that values are automatically calculated
    ColCount = 5
    RowCount = 5
    '*********Copy and pasted from site as example, CHANGE LATER*******
    Haztable = New TableLayoutPanel
    Haztable.AutoScroll = True
    Haztable.Dock = DockStyle.Fill
    Haztable.ColumnCount = ColCount
    Haztable.RowCount = RowCount
    For rowNo As Integer = 0 To Haztable.RowCount - 1
        For columnNo As Integer = 0 To Haztable.ColumnCount - 1
            'Dim ctrl As Control = New Button
            'ctrl.Text = String.Format("{0} {1},{2}", ctrl.GetType().Name, columnNo, rowNo)
            'ctrl.Size = New Size(20, 20)
            'Haztable.Controls.Add(ctrl, columnNo, rowNo)
            Dim buttonname As String
            buttonname = "B" & columnNo & rowNo
            Dim button As Control = New Button
            button.Size = New Size(70, 20)
            button.Name = buttonname
            button.Text = buttonname
            Haztable.Controls.Add(button, columnNo, rowNo)
            AddHandler button.Click, AddressOf buttonname_Click
        Next
    Next
    Me.Controls.Add(Haztable)
    Call buttonfind()

这一切都有效,创建按钮网格,很像excel电子表格的布局。

按钮是根据它们的XY位置命名的(例如(1,1)中的按钮将被称为"B11"),但问题是我似乎不知道如何处理这些按钮,即

*如果B(X.Y)被点击,那么保存布尔值按钮在X,Y被按下。

如果有一种算法来扫描和检查是否有任何按钮被按下,而不是为每个按钮使用"Select Case",那将是很棒的。我只是在设计器中创建按钮,但对于我的完整代码,我需要1000+按钮,这似乎是一种低效的方式。

你的buttonname_Click应该有一个Sender对象,它是你点击的按钮,只是将它转换为一个按钮,然后检查名称。

Private Sub buttonname_Click(sender As System.Object, e As System.EventArgs) 
    Dim btn As Button = CType(sender, Button)
    Select Case btn.Name
        Case "B11"
            'Do something
        Case "B12"
            'Do Something esle
            '...........
    End Select
End Sub

根据你的上一个语句看看这是否有效,如果你需要在程序的其他地方引用文本,你可能需要构建一个数组或列表

Private Sub buttonname_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Dim btn As Button = CType(sender, Button)
    If btn.Text = "H" Then
        btn.Text = "M"
    ElseIf btn.Text = "M" Then
        btn.Text = "L"
    ElseIf btn.Text = "L" Then
        btn.Text = ""
    Else
        btn.Text = "H"
    End If

End Sub

您已经添加了单击事件,并通过使用它们的行和列号来处理它们中的每一个。首先创建一个新按钮,这样您就可以访问行号和列号,无需花费的时间从控件名称解析列号和行号:

Public Class NewButton
    Inherits Button
    Public Row, Column, ClickCount as Integer
End Class

现在创建并处理:

Public Class Form1
    Sub addbuttons()
        Dim newbut As New NewButton
        newbut.Name = "B12"
        newbut.Row = "1"
        newbut.Column = "2"
        'and other properties...
        AddHandler newbut.Click, AddressOf clicked
        Me.Controls.Add(newbut)
    End Sub
    Sub clicked(sender As System.Object, e As System.EventArgs)
        Dim x As NewButton = DirectCast(sender, NewButton)
        If x.Column = 2 And x.Row = 1 Then
            x.ClickCount += 1
        End If
    End Sub
End Class

最新更新