【入門編】BindingSourceコンポーネントの徹底活用:リストの変更検知、フィルタリング、およびデータベース連携をスムーズに行うデータバインディングの極意 – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

Visual Basicの「魔法の杖」:BindingSourceでUI開発を極限までスマートにする極意

こんにちは。現場で長年VB.NETと格闘してきたエンジニアです。

皆さんは、Windows FormsでUIを作るとき、こんな「苦行」をしていませんか?
「データベースからデータを取ってきて、テキストボックスに一つずつ値を代入し、検索ボタンを押すたびにループでリストを書き換える……」

もしそうなら、今日でその苦労とはおさらばしましょう。`BindingSource` という強力なコンポーネントを使えば、コードは劇的に短くなり、あなたのアプリケーションは驚くほど軽快に動くようになります。

—

1. なぜ「BindingSource」を挟むのか?

想像してください。データソース(データベースやリスト)と、UIコントロール(ボタンやテキストボックス)が直接つながっている状態を。これは「密結合」と呼ばれ、変更に弱く、非常に脆い設計です。

ここに `BindingSource` を挟むと、「仲介役(コントローラー)」 が生まれます。

  • データの同期: データが更新されれば、自動でUIも変わる。
  • カレント行の管理: 今、どの行を見ているかを勝手に覚えていてくれる。
  • フィルタリング: 複雑なループを書かずに、一行のコードで検索ができる。

これが、プロが設計する「疎結合」の第一歩です。

—

2. 実践:BindingSourceでフィルタリングを実装する

まずは、リストデータを画面に表示し、TextBoxの入力に合わせてリアルタイムで絞り込む機能を実装してみましょう。

手順1: 準備

フォームに `DataGridView` と `TextBox` を配置し、ツールボックスから `BindingSource` をドラッグ&ドロップしてください。

手順2: コードの実装

以下のコードを参考にしてください。VB.NETらしい、直感的かつ強力な書き方です。

Public Class Form1
‘ データを保持するリスト
Private myDataList As New List(Of Customer)
‘ 仲介役のBindingSource
Private bs As New BindingSource()

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
‘ 1. ダミーデータの作成
myDataList.Add(New Customer With {.Name = “佐藤”, .City = “東京”})
myDataList.Add(New Customer With {.Name = “鈴木”, .City = “大阪”})

‘ 2. BindingSourceにデータソースを設定
bs.DataSource = myDataList

‘ 3. UIコントロールをBindingSourceに紐付け
DataGridView1.DataSource = bs
End Sub

‘ TextBoxの内容が変わるたびにフィルタリングする
Private Sub txtSearch_TextChanged(sender As Object, e As EventArgs) Handles txtSearch.TextChanged
‘ BindingSourceのFilterプロパティを使うだけでOK!
‘ 名前(Name)に検索文字が含まれるものを抽出
If String.IsNullOrWhiteSpace(txtSearch.Text) Then
bs.Filter = “” ‘ 検索文字が空なら全表示
Else
‘ SQLのWHERE句と同じ感覚で記述可能
bs.Filter = String.Format(“Name LIKE ‘%{0}%'”, txtSearch.Text)
End If
End Sub
End Class

‘ サンプル用のクラス
Public Class Customer
Public Property Name As String
Public Property City As String
End Class

—

3. なぜこのコードが「美しい」のか?

ここでのポイントは、「データの状態管理を自分でやらない」 という点です。

  • 変更検知: `myDataList` の中身を書き換えても、`bs.ResetBindings(False)` を呼ぶだけでUIが再描画されます。
  • カレント行の移動: `bs.MoveNext()` や `bs.MovePrevious()` を使うだけで、データ行の移動に伴うテキストボックスへの値反映まで自動で行われます。
  • エラーの回避: 初学者がやりがちな「インデックス範囲外エラー」も、BindingSourceが管理しているため発生しにくくなります。

—

4. 陥りやすい罠と解決策

私が新人の頃によくやった失敗を共有します。これを避けるだけで、一気に中級者へステップアップできます。

  • 罠1:データソースの型が正しくない
  • `BindingSource` は、`List(Of T)` などの強い型指定が大好きです。`DataTable` を使う場合も、必ず `DataSet` や `BindingSource` を介してください。
  • 罠2:フィルタリング後の「カレント行」の意識欠如
  • フィルタリングをした後は、カレント行が変わることがあります。`bs.Current` プロパティを使って、常に「今どのデータを操作しているか」を確認する癖をつけてください。
  • 罠3:UIスレッド外からの更新
  • データベースから非同期でデータを取ってくる場合、`BindingSource` の更新を `Invoke` メソッドでUIスレッドに戻す必要があります。ここだけは注意してください。

—

まとめ:自動化の先にある世界へ

`BindingSource` を使いこなすことは、単にコードを短くすることではありません。「データ」と「見た目」を切り離すという設計思想を身につけることなのです。

これができるようになると、将来的にWPFやMVVMモデルへ移行した際も、すんなりと理解できるようになります。VB.NETの持つ可能性は、まだまだこんなものではありません。

まずは、今のプロジェクトにある「手動でグリッドを更新している箇所」を一つだけ、この `BindingSource` に置き換えてみてください。そのコードの軽やかさに、きっと驚くはずですよ。

それでは、素晴らしいコーディングライフを!何か分からないことがあれば、いつでもまた聞きに来てくださいね。

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