在动态表单中,如何将文本框(tbRef)的内容链接到随其生成的按钮?

时间:2016-03-27 15:16:45

标签: vb.net winforms ctype directcast

我仍然在学习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将每个文本框的内容强制转换为使用它生成的按钮,但我无法找到有关如何在此上下文中使用这些操作符的任何教程。任何帮助将不胜感激。

1 个答案:

答案 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