2

我仍在学习 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

我的问题是:

代码生成正确的布局和正确的控件,如果只返回一个结果,按钮就可以正常工作。如果创建了多个按钮,则所有按钮都引用最后生成的 Textbox 的内容。我在互联网上得到的唯一答案是我必须以某种方式使用 Ctype/DirectCast 将每个文本框的内容转换为使用它生成的按钮,但我找不到任何关于如何在这种情况下使用这些运算符的教程。任何帮助将不胜感激。

4

1 回答 1

2

作为一个选项,您可以使用Tag按钮的属性并将对文本框的引用存储在标签属性中。然后,当您想找到按钮负责的文本框时,可以使用DirectCast. 按钮本身位于处理事件的方法的 sender 参数中。

您还可以为文本框指定名称并将名称存储在标记属性中,然后使用该名称查找控件。

例如

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
于 2016-03-27T15:30:12.150 回答