データ連結に関連するインターフェイス

ADO.NET を使用すると、アプリケーションのバインドのニーズや使用するデータに合わせてさまざまなデータ構造を作成できます。 Windows フォームでデータを提供または使用するための独自のクラスを作成することもできます。 これらのオブジェクトは、基本的なデータ バインディングから、デザイン時サポートの提供、エラー チェック、変更通知、データ自体に加えられた変更の構造化されたロールバックのサポートに至るまで、さまざまなレベルの機能を提供することができ、複雑さに対応できます。

データ バインディング インターフェイスのコンシューマー

以下のセクションでは、インターフェイス オブジェクトの 2 つのグループについて説明します。 1 つ目のグループでは、データ ソース作成者がデータ ソースに実装するインターフェイスを示します。 これらのインターフェイスは、データ ソース コンシューマーが使用するように設計されています。ほとんどの場合、データ ソース コンシューマーは、Windows フォーム コントロールまたはコンポーネントです。 2 つ目のグループでは、コンポーネント作成者向けに設計されたインターフェイスを示します。 コンポーネント作成者は、Windows フォーム データ バインディング エンジンが使用する、データ バインディングをサポートするコンポーネントを作成するときにこれらのインターフェイスを使用します。 フォームに関連付けられたクラス内でこれらのインターフェイスを実装することで、データ バインディングを実現できます。各ケースは、データの操作を可能にするインターフェイスを実装するクラスを示しています。 Visual Studio の RAD (Rapid Application Development) データ デザイン エクスペリエンス ツールでは、この機能を既に活用しています。

データ ソース作成者が実装するインターフェイス

以下のインターフェイスは、Windows フォーム コントロールで使用するように設計されています。

  • IList インターフェイス

    IList インターフェイスを実装するクラスには、ArrayArrayListCollectionBase があります。 これらは、Object 型の項目のインデックス付きリストです。 インデックスの最初の項目によって型が決定されるため、これらのリストには同種の型が含まれている必要があります。 IList は、実行時にのみバインドに使用できます。

    注意

    Windows フォームにバインドするためにビジネス オブジェクトのリストを作成する場合は、BindingList<T> を使用することを検討してください。 BindingList<T> は、双方向の Windows フォーム データ バインディングに必要な主要インターフェイスを実装する拡張可能なクラスです。

  • IBindingList インターフェイス

    IBindingList インターフェイスを実装するクラスは、非常に高レベルのデータ バインディング機能を提供します。 この実装では、基本的な並べ替え機能と変更通知を提供します。変更通知では、リスト項目が変更されたとき (たとえば、顧客リストの 3 番目の項目の Address フィールドが変更されたとき) と、リスト自体が変更されたとき (たとえば、リスト内の項目の数が増減したとき) のどちらの場合も変更が通知されます。 複数のコントロールを同じデータにバインドする予定であり、いずれかのコントロールで行われたデータ変更をバインドされた他のコントロールに反映させる必要がある場合に、変更通知が重要になります。

    注意

    IBindingList インターフェイスの変更通知は、SupportsChangeNotification プロパティによって有効化されます。このプロパティが true の場合に ListChanged イベントが発生し、リストまたはリスト内の項目が変更されたことが示されます。

    変更の種類は、ListChangedEventArgs パラメーターの ListChangedType プロパティで示されます。 したがって、データ モデルが更新されるたびに、依存するビュー (同じデータ ソースにバインドされた他のコントロールなど) も更新されます。 ただし、リストで ListChanged イベントを発生させることができるように、リストに含まれるオブジェクトは、変更時にリストに通知する必要があります。

    注意

    BindingList<T> は、IBindingList インターフェイスの汎用実装です。

  • IBindingListView インターフェイス

    IBindingListView インターフェイスを実装するクラスは、IBindingList の実装のすべての機能に加え、フィルター処理機能と高度な並べ替え機能も提供します。 この実装では、文字列ベースのフィルター処理と、プロパティ記述子と方向のペアによる複数列の並べ替え機能を提供します。

  • IEditableObject インターフェイス

    IEditableObject インターフェイスを実装するクラスでは、オブジェクトへの変更をいつ永続化するかをそのオブジェクトが制御できます。 この実装により、BeginEditEndEditCancelEdit の各メソッドを使用できるようになるので、オブジェクトに加えた変更のロールバックが可能になります。 BeginEditEndEditCancelEdit の各メソッドの機能と、これらのメソッドが相互に連携して、データに加えられた変更のロールバックを実現するしくみについて、以下に簡単に説明します。

    • BeginEdit メソッドは、オブジェクトの編集の開始を通知します。 このインターフェイスを実装するオブジェクトは、CancelEdit メソッドが呼び出された場合に更新を破棄できる方法で、BeginEdit メソッドの呼び出し後に行われたすべての更新を保存する必要があります。 Windows フォームのデータ バインディングでは、1 つの編集トランザクションのスコープ内で、(BeginEditBeginEditEndEdit のように) BeginEdit を複数回呼び出すことができます。 IEditableObject の実装では、BeginEdit が既に呼び出されているかどうかを追跡し、以降の BeginEdit の呼び出しを無視する必要があります。 このメソッドは複数回呼び出すことができるため、メソッドの以降の呼び出しが非破壊的であることが重要です。つまり、以降の BeginEdit 呼び出しでは、既に行われている更新を破棄したり、最初の BeginEdit 呼び出し時に保存されたデータを変更したりすることはできません。

    • 基になるオブジェクトが現在編集モードの場合、EndEdit メソッドは、BeginEdit が呼び出された後に加えられたすべての変更をオブジェクトにプッシュします。

    • CancelEdit メソッドは、オブジェクトに加えられたすべての変更を破棄します。

    BeginEditEndEditCancelEdit の各メソッドの機能の詳細については、「データをデータベースに保存する」を参照してください。

    データ機能のこのトランザクションの概念は、DataGridView コントロールで使用されています。

  • ICancelAddNew インターフェイス

    ICancelAddNew インターフェイスを実装するクラスでは、通常は IBindingList インターフェイスを実装し、AddNew メソッドによるデータ ソースへの追加をロールバックできるようにします。 データ ソースが IBindingList インターフェイスを実装している場合は、ICancelAddNew インターフェイスも実装する必要があります。

  • IDataErrorInfo インターフェイス

    IDataErrorInfo インターフェイスを実装するクラスでは、オブジェクトはバインドされたコントロールにカスタム エラー情報を提供できます。

    • Error プロパティは、一般的なエラー メッセージ テキスト (例: "エラーが発生しました") を返します。

    • Item[] プロパティは、列の具体的なエラー メッセージを含む文字列 (例: "State 列の値が無効です") を返します。

  • IEnumerable インターフェイス

    IEnumerable インターフェイスを実装するクラスは、一般に ASP.NET によって使用されます。 Windows フォームによるこのインターフェイスのサポートを利用できるようにするには、BindingSource コンポーネントを使用する必要があります。

    注意

    BindingSource コンポーネントにより、バインドのためにすべての IEnumerable 項目が別のリストにコピーされます。

  • ITypedList インターフェイス

    ITypedList インターフェイスを実装するコレクション クラスでは、バインドされたコントロールに公開されるプロパティの順序とセットを制御できます。

    注意

    GetItemProperties メソッドを実装したときに、PropertyDescriptor 配列が null でない場合、配列の最後のエントリが、項目の別のリストであるリスト プロパティを示すプロパティ記述子になります。

  • ICustomTypeDescriptor インターフェイス

    ICustomTypeDescriptor インターフェイスを実装するクラスは、そのクラス自体に関する動的な情報を提供します。 このインターフェイスは ITypedList に似ていますが、リストではなくオブジェクトに使用されます。 このインターフェイスは、基になる行のスキーマを反映するために DataRowView で使用されます。 ICustomTypeDescriptor の単純な実装は、CustomTypeDescriptor クラスによって提供されます。

    注意

    ICustomTypeDescriptor を実装する型へのデザイン時のバインドをサポートするには、その型が IComponent も実装し、フォーム上にインスタンスとして存在する必要があります。

  • IListSource インターフェイス

    IListSource インターフェイスを実装するクラスを使用すると、リスト以外のオブジェクトでリストベースのバインドが可能になります。 IListSourceGetList メソッドを使用すると、IList を継承していないオブジェクトからバインド可能なリストを返すことができます。 IListSourceDataSet クラスによって使用されます。

  • IRaiseItemChangedEvents インターフェイス

    IRaiseItemChangedEvents インターフェイスを実装するクラスは、IBindingList インターフェイスも実装するバインド可能なリストです。 このインターフェイスを使用すると、現在の型で ItemChanged 型の ListChanged イベントを発生させるかどうかを RaisesItemChangedEvents プロパティによって示すことができます。

    注意

    データ ソースが前述のプロパティからリストへのイベント変換を提供し、BindingSource コンポーネントとやり取りする場合は、IRaiseItemChangedEvents を実装する必要があります。 実装していない場合、BindingSource によってプロパティからリストへのイベント変換も実行されるため、パフォーマンスが低下します。

  • ISupportInitialize インターフェイス

    ISupportInitialize インターフェイスを実装するコンポーネントでは、プロパティの設定と相互に依存するプロパティの初期化にバッチ最適化を利用します。 ISupportInitialize には、次の 2 つのメソッドがあります。

    • BeginInit は、オブジェクトの初期化の開始を通知します。

    • EndInit は、オブジェクトの初期化の終了を通知します。

  • 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 の実装が必要になることはほとんどありません。

関連項目