Как в динамической форме связать содержимое текстового поля (tbRef) с кнопкой, сгенерированной вместе с ней?
Я все еще учу VB и столкнулся с проблемой без приличного учебника. Я создал динамическую форму, которая генерирует текстовое поле и кнопку обновления в каждом цикле цикла.
Я объявил следующие глобальные переменные:
Dim tbRef As Textbox
WithEvents btnUpdate As Button
а позже в цикле следующее
Do Until counter = Maxrows
counter = counter + 1
...
tbRef = New TextBox
...
Me.Controls.Add(tbRef)
btnUpdate = New button
...
AddHandler btnUpdate.Click, AddressOf btnUpdate_Click
Me.Controls.Add(btnUpdate)
...
tbRef.Text = ds.Tables("Records").Rows(counter - 1).Item(0)
Loop
И наконец
Private Sub btnUpdate_Click(sender As Object, e As EventArgs) Handles btnUpdate.Click
UpdateForm.tbRef.Text = Me.tbRef.Text
UpdateForm.Show()
End Sub
Моя проблема заключается в следующем:
Код генерирует правильный макет и правильные элементы управления, и кнопка работает нормально, если возвращается только один результат. Если создано более одной кнопки, все кнопки ссылаются на содержимое последнего сгенерированного текстового поля. Единственный ответ, который я получил в Интернете, заключается в том, что я должен каким-то образом использовать Ctype/DirectCast для приведения содержимого каждого текстового поля к сгенерированной с ним кнопке, но я не могу найти какое-либо руководство по использованию этих операторов в этом контексте. Любая помощь будет принята с благодарностью.
1 ответ
Как вариант, вы можете использовать Tag
свойство кнопки и сохраните ссылку на текстовое поле в свойстве тега. Затем, когда вы хотите найти текстовое поле, за которое отвечает кнопка, вы можете распаковать текстовое поле из свойства тега кнопки, используя DirectCast
, Сама кнопка находится в параметре отправителя метода, который обрабатывает событие.
Вы также можете присвоить имя текстовым полям и сохранить имя в свойстве тега, а затем найти элемент управления, используя это имя.
Например
For index = 1 To 10
Dim txt = New TextBox()
'Set other properties
'Add it to form
Dim btn = New Button()
btn.Tag = txt
AddHandler btn.Click, New EventHandler(AddressOf btn_Click)
'Set other properties
'Add it to form
Next
Вы можете обработать событие следующим образом:
Private Sub btn_Click(sender As Object, e As EventArgs)
Dim btn = DirectCast(sender, Button)
Dim txt = DirectCast(btn.Tag, TextBox)
MessageBox.Show(txt.Text)
End Sub