我仍然在学习VB并遇到了没有像样教程的问题。 我创建了一个动态表单,在循环的每个循环中生成一个Textbox和一个Update按钮。
我已声明以下全局变量:
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将每个文本框的内容强制转换为使用它生成的按钮,但我无法找到有关如何在此上下文中使用这些操作符的任何教程。任何帮助将不胜感激。
答案 0 :(得分:2)
作为一个选项,您可以使用按钮的Tag
属性并在tag属性中存储对文本框的引用。然后,当您想要找到按钮负责的文本框时,可以使用DirectCast
从按钮的tag属性中取消选中文本框。按钮本身位于处理事件的方法的sender参数中。
您还可以为文本框指定名称并将名称存储在tag属性中,然后使用该名称查找控件。
例如
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