データ連結に関連するインターフェイス
更新 : 2007 年 11 月
ADO.NET では、アプリケーションで必要なバインディングや、処理する対象のデータに合わせて、さまざまなデータ構造を作成できます。Windows フォームでデータを提供または利用するための独自のクラスを作成すると役立つ場合があります。これらのオブジェクトはさまざまなレベルの機能を提供でき、複雑さもそれぞれに異なります。基本的なデータ バインディングを提供するもの、デザイン時のサポート、エラー チェック機能、または変更通知機能を提供するもの、さらには、データ自体に加えられた変更の構造化されたロールバックをサポートするものまであります。
データ バインディング インターフェイスのコンシューマ
以下のセクションでは、インターフェイス オブジェクトを 2 つのグループに分けて説明します。1 つ目のグループは、データ ソース作成者がデータ ソースに実装するインターフェイスの一覧です。これらのインターフェイスは、データ ソース コンシューマによって利用されるようにデザインされています。データ ソース コンシューマは、通常は Windows フォーム コントロールまたはコンポーネントです。2 つ目のグループは、コンポーネント作成者によって利用されるようデザインされているインターフェイスの一覧です。Windows フォーム データ バインディング エンジンが利用する、データ バインディングをサポートするコンポーネントを作成するときに、コンポーネント作成者はこれらのインターフェイスを使用します。これらのインターフェイスを、フォームに関連付けられたクラス内に実装することにより、データ バインディングを使用可能にできます。つまり、データとの対話を実現するインターフェイスを実装したクラスを作成できます。Visual Studio の Rapid Application Development (RAD) データ デザイン体験ツールでは、この機能が既に活用されています。
インターフェイスの実装の詳細については、「Implements キーワードおよび Implements ステートメント」(Visual Basic) または「インターフェイス (C# リファレンス)」(C# キーワード) を参照してください。
データ ソース作成者が実装するインターフェイス
以下のインターフェイスは、Windows フォーム コントロールによって利用されるようにデザインされています。
IList インターフェイスの使い方
IList インターフェイスを実装するクラスには、Array、ArrayList、および CollectionBase があります。これらは、Object 型の項目のインデックス付きリストです。これらのリストは、同じ型のみを格納できます。インデックスの先頭の項目によって型が決定されるからです。IList をバインディングに利用できるのは実行時のみです。
メモ : Windows フォームとのバインディングのために、ビジネス オブジェクトのリストを作成する場合には、BindingList<T> の使用を検討する必要があります。BindingList<T> は、双方向の Windows フォーム データ バインディングに必要となる主要なインターフェイスが実装された、拡張性のあるクラスです。
IBindingList インターフェイスの使い方
IBindingList インターフェイスを実装するクラスは、はるかに高いレベルのデータ バインディング機能を提供します。この実装は、基本的な並べ替え機能と変更通知機能を持ちます。変更通知機能では、リスト項目が変更されたとき (たとえば、顧客リストの 3 番目の項目で Address フィールドが変更されたとき) とリスト自体が変更されたとき (たとえば、リスト内の項目の数が増減したとき) の両方について変更が通知されます。変更通知は、複数のコントロールを同じデータにバインドする予定のときに、1 つのコントロールで行ったデータ変更を他のバインド コントロールにも反映させる場合に重要です。
メモ : IBindingList インターフェイスの変更通知は SupportsChangeNotification プロパティで有効にされます。このプロパティが true の場合には ListChanged イベントが発生し、リストまたはその中の項目が変更されたことが示されます。
変更の種類は、ListChangedEventArgs パラメータの ListChangedType プロパティで示されます。したがって、データ モデルが更新されたときには、それに依存するビュー (たとえば、同じデータ ソースにバインドされた他のコントロール) も更新されます。ただし、リストが ListChanged イベントを発生させるためには、リスト内に含まれるオブジェクトが変更されたときに、それをリストに通知する必要があります。
メモ : BindingList<T> は、IBindingList インターフェイスの汎用実装です。
IBindingListView インターフェイスの使い方
IBindingListView インターフェイスを実装するクラスは、IBindingList の実装が持つすべての機能に加えて、フィルタ処理機能および高度な並べ替え機能を持ちます。この実装は、文字列ベースのフィルタ処理、およびプロパティ記述子と方向のペアによる複数列の並べ替え機能を提供します。
IEditableObject インターフェイスの使い方
IEditableObject インターフェイスを実装するクラスを使用すると、オブジェクトへの変更を永続化するタイミングをオブジェクトが制御できるようになります。この実装により、BeginEdit、EndEdit、および CancelEdit の各メソッドを使用できるようになり、それによってオブジェクトへの変更をロールバックできます。次に示すのは、BeginEdit、EndEdit、および CancelEdit の各メソッドの機能と、データに対して加えられた変更のロールバックを実現するためのこれら各メソッドの連係についての簡単な説明です。
BeginEdit メソッドはオブジェクトの編集の開始を示します。このインターフェイスを実装するオブジェクトは、BeginEdit メソッドの呼び出し後に加えられたすべての更新を格納して、CancelEdit メソッドが呼び出されたときに破棄できるようにする必要があります。Windows フォームのデータ バインディングでは、1 つの編集トランザクションのスコープ内で BeginEdit を複数回呼び出すことができます (たとえば、BeginEdit、BeginEdit、EndEdit)。IEditableObject の実装では、BeginEdit が既に呼び出されたかどうかを追跡し、それ以降の BeginEdit の呼び出しを無視する必要があります。このメソッドは複数回呼び出すことができるため、同じメソッドの以降の呼び出しが破壊的でないことが重要です。つまり、以降の BeginEdit の呼び出しでは、既に加えられている更新を破棄したり、最初の BeginEdit 呼び出し時に保存されたデータを変更したりすることはできません。
EndEdit メソッドは、基になるオブジェクトが現在編集モードである場合に、BeginEdit の呼び出し後に加えられた変更をオブジェクトに反映します。
CancelEdit メソッドは、オブジェクトに加えられた変更を破棄します。
BeginEdit、EndEdit、および CancelEdit の各メソッドの機能の詳細については、「データ保存の概要」を参照してください。
データ機能のこのトランザクションの概念は、DataGridView コントロールで使用されています。
ICancelAddNew インターフェイスの使い方
ICancelAddNew インターフェイスを実装するクラスには、IBindingList インターフェイスも実装するのが一般的で、AddNew メソッドでデータ ソースに対して行われた追加をロールバックできるようにします。データ ソースに IBindingList インターフェイスを実装する場合には、ICancelAddNew インターフェイスも実装する必要があります。
IDataErrorInfo インターフェイスの使い方
IDataErrorInfo インターフェイスを実装するクラスでは、オブジェクトからバインド コントロールに対してカスタムのエラー情報を次のように提供できます。
IEnumerable インターフェイスの使い方
IEnumerable インターフェイスを実装するクラスは、ASP.NET によって利用されるのが一般的です。このインターフェイスに対する Windows フォームのサポートは、BindingSource コンポーネントを通じてのみ利用できます。
メモ : BindingSource コンポーネントは、バインディングのために、すべての IEnumerable 項目を別個のリストにコピーします。
ITypedList インターフェイスの使い方
ITypedList インターフェイスを実装するコレクション クラスは、バインド コントロールに対して公開するプロパティの順序と組み合わせを制御する機能を持ちます。
メモ : GetItemProperties メソッドを実装するとき、PropertyDescriptor 配列が null でない場合には、配列の最後のエントリは、他の項目リストであるリスト プロパティを説明するプロパティ記述子です。
ICustomTypeDescriptor インターフェイスの使い方
ICustomTypeDescriptor インターフェイスを実装するクラスは、自らに関する動的な情報を提供します。このインターフェイスは ITypedList に似ていますが、リストではなくオブジェクトに対して使用されます。このインターフェイスは、DataRowView によって、基になる行のスキーマを反映するために使用されます。ICustomTypeDescriptor の単純な実装は CustomTypeDescriptor クラスにより提供されています。
メモ : ICustomTypeDescriptor を実装する型に対するデザイン時バインディングをサポートするためには、その型に IComponent も実装し、フォーム上にインスタンスとして配置する必要があります。
IListSource インターフェイスの使い方
IListSource インターフェイスを実装するクラスでは、非リスト オブジェクトへのリストベース バインディングが可能になります。IListSource の GetList メソッドを使用すると、IList を継承していないオブジェクトから、バインドできるリストを取得できます。IListSource は DataSet クラスが使用します。
IRaiseItemChangedEvents インターフェイスの使い方
IRaiseItemChangedEvents インターフェイスを実装するクラスは、IBindingList インターフェイスも実装する、バインドできるリストです。このインターフェイスは、ItemChanged 型の ListChanged イベントを発生させる型かどうかを RaisesItemChangedEvents プロパティを通じて示すために使用されます。
メモ : データ ソースが、前述のリスト イベント変換を行うプロパティを持ち、BindingSource コンポーネントとやり取りする場合には、IRaiseItemChangedEvents を実装する必要があります。その他の場合は、BindingSource がリスト イベント変換のためのプロパティを実行し、結果としてパフォーマンスが低下します。
ISupportInitialize インターフェイスの使い方
ISupportInitialize インターフェイスを実装するコンポーネントは、プロパティの設定、および互いに依存するプロパティの初期化のために、バッチ最適化を活用します。ISupportInitialize は次の 2 つのメソッドを持ちます。
ISupportInitializeNotification インターフェイスの使い方
ISupportInitializeNotification インターフェイスを実装するコンポーネントは ISupportInitialize インターフェイスも実装します。このインターフェイスを使用すると、他の ISupportInitialize コンポーネントに対して初期化の完了を通知できます。ISupportInitializeNotification インターフェイスは次の 2 つのメンバを持ちます。
IsInitialized は、コンポーネントが初期化されているかどうかを示す boolean 値を返します。
Initialized は、EndInit が呼び出されたときに発生します。
INotifyPropertyChanged インターフェイスの使い方
このインターフェイスを実装するクラスは、いずれかのプロパティ値が変更されたときにイベントを発生させる型です。このインターフェイスは、コントロールの各プロパティに対して変更イベントを用意するパターンを置き換えるようにデザインされています。BindingList<T> で使用する場合、ビジネス オブジェクトは INotifyPropertyChanged インターフェイスを実装する必要があり、BindingList`1 は PropertyChanged イベントを ItemChanged 型の ListChanged イベントに変換します。
メモ : バインド クライアントとデータ ソースとの間のバインディングで変更通知が行われるためには、バインドされるデータ ソース型に INotifyPropertyChanged インターフェイスを実装するか、またはバインドされる型に propertyNameChanged イベントを用意するかのいずれか一方を行う必要があります。両方を行うことはできません (前者を行うことをお勧めします)。
コンポーネント作成者が実装するインターフェイス
以下のインターフェイスは、Windows フォームのデータ バインディング エンジンによって利用されるようデザインされています。
IBindableComponent インターフェイスの使い方
このインターフェイスを実装するクラスは、データ バインディングをサポートする非コントロール コンポーネントです。このクラスは、このインターフェイスの DataBindings プロパティおよび BindingContext プロパティを通じて、コンポーネントのデータ バインディングおよびバインディング コンテキストを返します。
メモ : Control を継承するコンポーネントの場合は、IBindableComponent インターフェイスを実装する必要はありません。
ICurrencyManagerProvider インターフェイスの使い方
ICurrencyManagerProvider インターフェイスを実装するクラスは、この特定のコンポーネントに関連付けられたバインディングを管理するための独自の CurrencyManager を持つコンポーネントです。カスタムの CurrencyManager へは CurrencyManager プロパティからアクセスできます。
メモ : Control を継承するクラスでは、バインディングは BindingContext プロパティを通じて自動的に管理されます。そのため、ICurrencyManagerProvider の実装が必要なケースはきわめてまれです。
参照
処理手順
方法 : Windows フォームに単純バインド コントロールを作成する