Динамически AddHandler - PullRequest
       22

Динамически AddHandler

1 голос
/ 05 марта 2012

У меня большое количество кнопок на форме (144 кнопки). Названия каждой кнопки представляют собой комбинацию различных факторов.

Мне нужно, чтобы они все делали одно и то же при нажатии. У меня есть это событие в Private Sub под названием "ClickButton".

Я хочу использовать цикл, чтобы AddHandler каждой кнопки к событию "ClickButton".

Сначала мне нужно обратиться к каждой кнопке. Я делаю это путем динамического построения их имени в цикле.

Dim PeriodRoomID As New Button
Dim cntrl() As Control    

For Each Row In dsAllRooms.Tables("sqlAllRooms").Rows
            For Count = 1 To 13
                RoomID = Row.Item(0)
'This is where the name of each room is dynamically created. 
'It is stored in PeriodRoomID.name
                PeriodRoomID.Name = "R02" & RoomID.PadLeft(3, "0"c) & Count
                cntrl = Me.Controls.Find(PeriodRoomID.Name, True)
                AddHandler cntrl(0).Click, AddressOf ClickButton
            Next
        Next

Проблема в том, что ничего не происходит. AddHandler не работает. Однако, если я просто напишу одно из названий кнопок;

AddHandler R020011, AddressOf ClickButton

Тогда это работает. Что-то идет не так в Me.Controls.Find. Кажется, он не может найти ни одной кнопки под этим именем, что странно, потому что я использую тот же код в других разделах, и он находит кнопку.

1 Ответ

1 голос
/ 05 марта 2012

Вы определяете Dim PeriodRoomID As New Button из for оператора, поэтому каждый раз, когда вы устанавливаете имя, вы устанавливаете его на одну и ту же кнопку PeriodRoomID, так что вам не нужна эта кнопка и cntrl ни вообще, просто:

For Each Row In dsAllRooms.Tables("sqlAllRooms").Rows
            For Count = 1 To 13
                RoomID = Row.Item(0)
                'This is where the name of each room is dynamically created.   
                dim Ctrls = Me.Controls.Find("R02" & RoomID.PadLeft(3, "0"c) & CStr(Count), True)
                If (Ctrls.Count > 0) Then
                   AddHandler Ctrls(0).Click, AddressOf ClickButton
                End If
            Next
Next
...