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