2012-03-04 2 views
1

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

Мне нужно, чтобы все они делали то же самое при нажатии. У меня есть это событие под 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. Кажется, он не может найти какую-либо кнопку под этим именем, что является странным, потому что я использую тот же код в других разделах, и он находит кнопку.

+0

В какой момент в жизненном цикле страницы работает эта программа? В какой момент вы создаете кнопки? – jmaglio

+0

Есть ли другие кнопки в одной форме? Другими словами, будет ли установка обработчика всех кнопок на форме работать для вас? – svick

+0

@jfmags Кнопки не динамически создаются, они создаются с помощью формы. –

ответ

1

Вы определяете 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