Обработчики событий для панели динамического макета таблицы в Visual Basic

Я делаю игру типа риска для школы, которая динамически создает сетку кнопок 4х4 на панели макета таблицы в Visual Basic. Я успешно создал панель и кнопки с именами, которые соответствуют строке и столбцу кнопки. Есть также два параллельных массива - один для владельца кнопки, а другой для номера кнопки - которые соответствуют владельцу кнопки и количеству "армий" в кнопке. Моя проблема в том, что когда пользователь нажимает на определенную кнопку, мне нужно указать имя / значение кнопки, чтобы узнать, сколько "армий" кнопка должна контролировать "атаку" в части хода игрока.

Следующий код создает панель макета таблицы и кнопки с именами.

'Create table Dynamically
    Dim ColCount As Integer = 4
    Dim RowCount As Integer = 4

    Dim f As New System.Drawing.Font("Arial", 15)

    riskTable.AutoScroll = True
    riskTable.Dock = DockStyle.Fill
    riskTable.ColumnCount = ColCount
    riskTable.RowCount = RowCount
    For rowNo As Integer = 0 To riskTable.RowCount - 1
        For columnNo As Integer = 0 To riskTable.ColumnCount - 1
            Dim buttonname As String
            buttonname = "B" & rowNo & columnNo
            Dim button As Control = New Button
            button.Size = New Size(179, 100)
            button.Name = buttonname
            button.Text = "1"
            button.ForeColor = Color.White
            button.Font = f
            AddHandler button.Click, AddressOf buttonname_Click
            riskTable.Controls.Add(button, columnNo, rowNo)
        Next
    Next
    Me.Controls.Add(riskTable)

Это обработчик динамических событий, который я создал. Я пытался использовать "Me.Click", чтобы получить имя кнопки, но он возвращает только имя формы. Мне нужно иметь здесь код, который ссылается на имя нажатой в данный момент кнопки, чтобы затем по очереди ссылаться на владельца ящика и массивы номеров ящиков.

Private Sub buttonname_Click(sender As Object, e As EventArgs) Handles Me.Click
    MessageBox.Show(Me.Name)
End Sub

Любая помощь будет принята с благодарностью! Я думаю, что как только я это заработаю, остальная часть игры будет довольно проста для понимания.

Спасибо!

1 ответ

Решение

Поместите имя в 'button.Tag' вместо этого / также:

button.Tag = buttonname

Тогда легко получить имя с помощью:

Private Sub buttonname_Click(sender As Object, e As EventArgs) Handles Me.Click
     Dim result As String = CType(CType(sender, System.Windows.Forms.Button).Tag, String)
End Sub

(Тем не менее, проверьте System.Windows.Forms.Button, возможно, потребуется подправить, чтобы соответствовать вашим кнопкам внутри таблицы. RiskTable.Controls.button?)

Другие вопросы по тегам