2

私はまだ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

私の問題は:

このコードは正しいレイアウトと正しいコントロールを生成し、結果が 1 つしか返されない場合でもボタンは正常に機能します。複数のボタンが作成されている場合、すべてのボタンは最後に生成された Textbox の内容を参照します。私がインターネットで得た唯一の答えは、Ctype/DirectCast を使用して各テキスト ボックスの内容を生成されたボタンにキャストする必要があるというものでしたが、このコンテキストでこれらの演算子を使用する方法に関するチュートリアルは見つかりません。どんな助けでも大歓迎です。

4

1 に答える 1

2

オプションとして、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
于 2016-03-27T15:30:12.150 に答える