【入門編】Windows Formsのコントロール配列(Control Array)の代替実装:動的に生成したボタンやテキストボックスのイベントをスマートに共有する – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

VB6からの卒業:Windows Formsの「コントロール配列」をスマートに乗りこなす極意

こんにちは。現場の最前線でコードを書き続けていると、「VB6のあの頃はコントロール配列が使えて便利だったな…」という溜息を耳にすることがあります。

VB.NETに移行した途端、フォーム上のコントロールを番号で指定できなくなり、途方に暮れてしまったあなたへ。安心してください。「AddHandler」という魔法を覚えれば、VB6の時代よりも遥かに柔軟で、かつ堅牢なUI設計が可能になります。

今日は、動的に生成したコントロールのイベントを一元管理する、プロの定石を伝授しましょう。

—

なぜ「コントロール配列」がなくなったのか?

VB6のコントロール配列は非常に直感的でしたが、オブジェクト指向の観点からは少々「乱暴」な実装でした。VB.NETでは、すべてのコントロールは「独立したオブジェクト」として扱われます。

一つひとつインスタンス(実体)を生成し、それぞれに個別のイベントを結びつける。一見すると面倒に思えますが、実はここに「イベントの共有」という強力な武器が隠されています。

—

ステップ1:動的にコントロールを生成する

まずは、フォーム上に「ボタンを10個並べる」処理を書いてみましょう。重要なのは、生成した直後に「どのイベントをどのメソッドで拾うか」を定義することです。

‘ ボタンを10個生成して配置するプロシージャ
Private Sub CreateDynamicButtons()
For i As Integer = 0 To 9
Dim btn As New Button()
btn.Name = “Btn_” & i
btn.Text = “ボタン ” & i
btn.Location = New Point(10, i 40)

‘ 【重要】AddHandlerでイベントを「共通のメソッド」に紐付ける
‘ ButtonのClickイベントを「CommonButton_Click」という関数に接続します
AddHandler btn.Click, AddressOf CommonButton_Click

Me.Controls.Add(btn)
Next
End Sub

ステップ2:イベントをスマートに共有する

ここが最大のポイントです。生成された10個のボタンは、すべて同じ `CommonButton_Click` を呼び出します。では、「どのボタンが押されたか」をどうやって判別するのでしょうか?

答えは、引数の `sender` にあります。

‘ すべての動的ボタンが共有するイベントハンドラ
Private Sub CommonButton_Click(sender As Object, e As EventArgs)
‘ senderは「イベントを発生させた張本人(ボタン)」そのものです
Dim clickedBtn As Button = DirectCast(sender, Button)

‘ これで、どのボタンが押されてもその名前やテキストを特定できます
MessageBox.Show(clickedBtn.Text & ” がクリックされました!”)

‘ 例えば、押されたボタンだけ色を変えるといった操作も自由自在
clickedBtn.BackColor = Color.LightBlue
End Sub

—

陥りやすい罠と解決策:なぜエラーになるのか?

初心者がよくハマるエラーを二つだけ挙げておきます。これさえ知っていれば怖くありません。

1. DirectCast(型変換)の失敗

`DirectCast(sender, Button)` は、あくまで「senderはButtonであるはずだ」という前提で行う命令です。もし、このメソッドを「チェックボックス」のイベントと共有してしまったら、変換エラー(InvalidCastException)が発生します。
対策: `If TypeOf sender Is Button Then …` のように、型チェックを入れるのがプロの現場の作法です。

2. コントロールの解放忘れ

動的に生成したコントロールは、フォームを閉じてもメモリに残り続けることがあります。もしアプリ内で頻繁に生成・破棄を繰り返すなら、`RemoveHandler` を使ってイベントとの接続を解除するクセをつけておきましょう。

—

なぜこの手法が「極限の知見」なのか

VB6のコントロール配列は、あくまで「番号」による管理でした。しかし、この `AddHandler` 方式を使えば、ボタンの `Tag` プロパティに「データベースのID」を埋め込んだり、特定のデータ構造と紐付けたりと、UIとロジックをより密接に、かつ疎結合に設計できます。

「マクロの記録」の枠を超え、オブジェクトのライフサイクルを意識した開発者への第一歩。それが、このイベントの共有化です。

まとめ:ここをクリアすれば、もう怖くない!

1. AddHandler を使って、動的生成と同時にイベントを接続する。
2. sender 引数を `DirectCast` することで、イベント発生源を特定する。
3. AddressOf で、特定のメソッドへ処理をルーティングする。

これさえ身につければ、Windows Formsの画面設計は自由自在です。ぜひ、今日からあなたのコードに取り入れてみてください。分からないことがあれば、またいつでも聞きに来てくださいね。あなたのコードが美しく動くことを、心から応援しています。

タイトルとURLをコピーしました