BindingSource コンポーネント アーキテクチャ

BindingSource コンポーネントを使用すると、すべての Windows フォーム コントロールをデータ ソースに全体的にバインドできます。

BindingSource コンポーネントを使用すると、コントロールをデータ ソースにバインドするプロセスが簡略化されます。従来のデータ バインドに対して次のような利点があります。

  • デザイン時にビジネス オブジェクトにバインドできるようになります。

  • CurrencyManager 機能をカプセル化し、デザイン時に CurrencyManager イベントを公開します。

  • IBindingList インターフェイスをサポートするリストの作成を簡略化します (リスト変更通知をネイティブでサポートしていないデータ ソースに対してリスト変更通知を提供します)。

  • IBindingList.AddNew メソッドのための機能拡張ポイントを提供します。

  • データ ソースとコントロールの間に間接参照のレベルを提供します。 この間接参照は、データ ソースが実行時に変更される可能性がある場合に重要です。

  • 他のデータ関連の Windows フォーム コントロール (特に BindingNavigator および DataGridView コントロール) と相互運用します。

このような理由から、Windows フォーム コントロールをデータ ソースにバインドするには、BindingSource コンポーネントを使用することをお勧めします。

BindingSource の機能

BindingSource コンポーネントには、コントロールをデータにバインドするための機能がいくつか用意されています。 これらの機能を使用すると、コーディングをほとんど行わずにほとんどのデータ バインディング シナリオを実装できます。

BindingSource コンポーネントは、多様な種類のデータ ソースにアクセスするための一貫したインターフェイスを提供することによってこれを実現します。 これは、あらゆる型へのバインドに同じ手順を使用することを意味します。 たとえば、DataSource プロパティを DataSet またはビジネス オブジェクトにアタッチすることができますが、どちらの場合も、てデータ ソースを操作するために、同じセットのプロパティ、メソッド、およびイベントを使用します。

BindingSource コンポーネントによって提供される一貫したインターフェイスにより、データをコントロールにバインドするプロセスが大幅に簡略化されます。 変更通知を提供するデータ ソースの種類の場合、BindingSource コンポーネントによって、変更がコントロールとデータ ソースの間で自動的に伝達されます。 変更通知を提供しないデータ ソースの種類の場合には、変更通知を発生させるためのイベントが提供されます。 次の一覧に、BindingSource コンポーネントでサポートされる機能を示します。

  • 間接参照。

  • 通貨管理。

  • リストとしてのデータ ソース。

  • IBindingList としての BindingSource

  • カスタム項目の作成。

  • トランザクション項目の作成。

  • IEnumerable のサポート。

  • デザイン時のサポート。

  • 静的 ListBindingHelper メソッド。

  • IBindingListView インターフェイスを使用した並べ替えとフィルター処理。

  • BindingNavigator との統合。

間接

BindingSource コンポーネントによって、コントロールとデータ ソースの間に間接参照のレベルが提供されます。 コントロールをデータ ソースに直接バインドする代わりに、コントロールを BindingSource にバインドし、データ ソースを BindingSource コンポーネントの DataSource プロパティにアタッチします。

この間接参照のレベルを使用すると、コントロールのバインディングをリセットせずにデータ ソースを変更できます。 これによって、次のことができるようになります。

通貨管理

BindingSource コンポーネントによって、通貨管理を処理する ICurrencyManagerProvider インターフェイスが実装されます。 ICurrencyManagerProvider インターフェイスでは、BindingSource の通貨マネージャーにも、同じ DataMember にバインドされている別の BindingSource の通貨マネージャーにもアクセスすることができます。

BindingSource コンポーネントによって、CurrencyManager 機能がカプセル化され、最も一般的な CurrencyManager のプロパティとイベントが公開されます。 次の表では、通貨管理に関連する一部のメンバーについて説明します。

CurrencyManager プロパティ
BindingSource に関連付けられた通貨マネージャーを取得します。

GetRelatedCurrencyManager メソッド
指定されたデータ メンバーにバインドされた別の BindingSource がある場合、その通貨マネージャーを取得します。

Current プロパティ
データソースの現在の項目を取得します。

Position プロパティ
基になるリストでの現在の位置を取得または設定します。

EndEdit メソッド
基になるデータ ソースに保留中の変更を適用します。

CancelEdit メソッド
現在の編集操作をキャンセルします。

リストとしてのデータ ソース

BindingSource コンポーネントによって、IBindingListView および ITypedList インターフェイスが実装されます。 この実装では、外部ストレージを使用せず、BindingSource コンポーネント自体をデータ ソースとして使用できます。

BindingSource コンポーネントがデータ ソースにアタッチされると、データ ソースがリストとして公開されます。

DataSource プロパティは、複数のデータ ソースに設定できます。 これには、型、オブジェクト、および型のリストが含まれます。 結果として得られるデータ ソースはリストとして公開されます。 次の表は、いくつかの一般的なデータ ソースと結果のリストの評価を示しています。

DataSource プロパティ リスト結果
null 参照 (Visual Basic の場合は Nothing)。 オブジェクトの空の IBindingList。 項目を追加すると、追加した項目の型にリストが設定されます。
DataMember を含む null 参照 (Visual Basic の場合は Nothing) サポートされていません。ArgumentException を発生させます。
リスト以外の型または型 "T" のオブジェクト 型 "T" の空の IBindingList
配列インスタンス 配列要素を含む IBindingList
IEnumerable インスタンス IEnumerable 項目を格納する IBindingList
型 "T" を含むリスト インスタンス 型 "T" を含む IBindingList インスタンス。

また、DataSource を他の種類のリスト (IListSourceITypedList など) に設定でき、BindingSource によって適切に処理されます。 この場合、リストに含まれる型には、パラメーターなしのコンストラクターが必要です。

IBindingList としての BindingSource

BindingSource コンポーネントには、基になるデータにアクセスして操作するためのメンバーが IBindingList として用意されています。 以下の表では、それらのメンバーについて説明します。

メンバー 説明
List プロパティ DataSource または DataMember プロパティの評価結果であるリストを取得します。
AddNew メソッド 基になるリストに新しい項目を追加します。 IBindingList インターフェイスを実装するデータ ソースに適用され、項目を追加できるようになります (つまり、AllowNew プロパティが true に設定されます)。

カスタム項目の作成

AddingNew イベントを処理して、独自の項目作成ロジックを提供できます。 AddingNew イベントが発生すると、BindingSource に新しいオブジェクトが追加されます。 このイベントは AddNew メソッドが呼び出された後で発生し、その後で、新しい項目が基になるリストに追加されます。 このイベントを処理することにより、BindingSource クラスから派生せずにカスタム項目作成動作を提供できます。 詳細については、「方法: Windows フォーム BindingSource を使用して項目の追加をカスタマイズする」を参照してください。

トランザクション項目の作成

BindingSource コンポーネントによって、トランザクション項目の作成を可能にする ICancelAddNew インターフェイスが実装されます。 AddNew の呼び出しを使用して新しい項目を一時的に作成した後で、次の方法で追加をコミットまたはロールバックできます。

  • EndNew メソッドによって、保留中の追加が明示的にコミットされます。

  • 他のコレクション操作 (挿入、削除、移動など) を実行すると、保留中の追加が暗黙的にコミットされます。

  • CancelNew メソッドによって、保留中の追加がロールバックされます (メソッドまだコミットされていない場合)。

IEnumerable のサポート

BindingSource コンポーネントによって、コントロールを IEnumerable データ ソースにバインドできるようになります。 このコンポーネントを使用すると、System.Data.SqlClient.SqlDataReader などのデータ ソースにバインドできます。

IEnumerable データ ソースが BindingSource がコンポーネントに割り当てられると、BindingSource によって IBindingList が作成され、IEnumerable データ ソースの内容がリストに追加されます。

デザイン時のサポート

ファクトリ クラスから作成されたオブジェクトや Web サービスによって返されるオブジェクトなど、オブジェクトの種類によっては、デザイン時に作成できません。 コントロールのバインド先のオブジェクトがメモリ内になくても、場合によっては、デザイン時にこれらの種類にコントロールをバインドする必要があります。 たとえば、DataGridView コントロールの列ヘッダーにカスタム型のパブリック プロパティの名前を付ける必要がある場合です。

このシナリオをサポートするために、BindingSource コンポーネントでは Type へのバインドがサポートされます。 TypeDataSource プロパティに割り当てると、BindingSource コンポーネントによって Type 項目の空の BindingList<T> が作成されます。 その後、BindingSource コンポーネントにどのコントロールをバインドしても、型のプロパティまたはスキーマの存在についてデザイン時または実行時に警告されます。 詳細については、「方法: Windows フォーム コントロールを型にバインドする」を参照してください。

静的 ListBindingHelper メソッド

System.Windows.Forms.BindingContextSystem.Windows.Forms.CurrencyManager、および BindingSource のすべての型では、DataSource/DataMember ペアからリストを生成するために共通のロジックが使用されます。 また、この共通のロジックは、次の static メソッドでコントロールの作成者や他のサード パーティが使用できるように公開されています。

IBindingListView インターフェイスを使用した並べ替えとフィルター処理

BindingSource コンポーネントによって、IBindingList インターフェイスの拡張である IBindingListView インターフェイスが実装されます。 IBindingList では単一列の並べ替えが提供され、IBindingListView では高度な並べ替えとフィルター処理が提供されます。 IBindingListView によって、データ ソース内の項目の並べ替えとフィルター処理を行うことができます (データ ソースでもこれらのインターフェイスのいずれかが実装されている場合)。 BindingSource コンポーネントでは、これらのメンバーの参照実装は提供されません。 代わりに、基になるリストに呼び出しが転送されます。

次の表では、並べ替えとフィルター処理に使用するプロパティについて説明します。

メンバー 説明
Filter プロパティ データ ソースが IBindingListView である場合は、表示する行のフィルター処理に使用する式を取得または設定します。
Sort プロパティ データ ソースが IBindingList である場合は、並べ替えに使用する列名と並べ替え順序情報を取得または設定します。

\- または -

データ ソースが IBindingListView であり、高度な並べ替えをサポートしている場合は、並べ替えに使用する複数の列名と並べ替え順序を取得します。

BindingNavigator との統合

BindingSource コンポーネントを使用して任意の Windows フォーム コントロールをデータ ソースにバインドできますが、BindingNavigator コントロールは BindingSource コンポーネントと連携するように特に設計されています。 BindingNavigator コントロールでは、BindingSource コンポーネントの現在の項目を制御するためのユーザー インターフェイスが提供されます。 BindingNavigator コントロールには、BindingSource コンポーネントのナビゲーション メソッドに対応するボタンが既定で用意されています。 詳細については、「方法: Windows フォーム BindingNavigator コントロールを使用してデータ間を移動する」を参照してください。

関連項目