1

こんにちは、特定の列と行に後で対応するボタンのグリッドを作成するために、現在プログラムにこの 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(XY) をクリックすると、X,Y のボタンが押されたブール値が保存されます。

ボタンごとに「ケースの選択」を使用する代わりに、ボタンが押されたかどうかをスキャンして確認するアルゴリズムが 1 つあると便利です。デザイナーでボタンを作成するだけですが、完全なコードでは 1000 個以上のボタンが必要になり、非効率的な方法に思えます。

4

2 に答える 2

0

buttonname_Click には、クリックした Button である Sender オブジェクトが必要です。それを Button にキャストし、名前を確認します。

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
于 2013-01-03T18:21:29.050 に答える
0

クリックされたイベントを追加し、行と列の番号を使用してそれぞれを処理しました。最初に新しいボタンを作成して、コントロール名から列番号と行番号を解析する手間をかけずに行番号と列番号にアクセスできるようにします。

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
于 2013-01-03T18:33:11.757 に答える