Как в динамической форме связать содержимое текстового поля (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
Другие вопросы по тегам