次の方法で共有


Windows フォームを使用したデータ バインディングの概要

Windows フォームでは、従来のデータ ソースだけでなく、データを含むほぼすべての構造にバインドできます。 実行時に計算する値の配列にバインドしたり、ファイルから読み取ったり、他のコントロールの値から派生したりできます。

さらに、任意のコントロールの任意のプロパティをデータ ソースにバインドできます。 従来のデータ バインディングでは、通常、表示プロパティ (Text コントロールの TextBox プロパティなど) をデータ ソースにバインドします。 .NET では、バインドを使用して他のプロパティを設定することもできます。 バインディングを使用して、次のタスクを実行できます。

  • イメージ コントロールのグラフィックの設定。

  • 1 つ以上のコントロールの背景色を設定します。

  • コントロールのサイズの設定。

基本的に、データ バインディングは、フォーム上の任意のコントロールの実行時にアクセス可能なプロパティを自動的に設定する方法です。

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

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

次のセクションでは、インターフェイス オブジェクトの 2 つのグループについて説明します。 インターフェイスの最初のグループは、データ ソースの作成者によってデータ ソースに実装されます。 Windows フォーム コントロールやコンポーネントなどのデータ ソース コンシューマーは、これらのインターフェイスを実装します。 インターフェイスの 2 番目のグループは、コンポーネントの作成者が使用するように設計されています。 コンポーネント作成者は、Windows フォーム データ バインディング エンジンで使用されるデータ バインディングをサポートするコンポーネントを作成するときに、これらのインターフェイスを使用します。 フォームに関連付けられているクラス内にこれらのインターフェイスを実装して、データ バインディングを有効にすることができます。 各ケースには、データとの対話を可能にするインターフェイスを実装するクラスが用意されています。 Visual Studio の迅速なアプリケーション開発 (RAD) データ設計エクスペリエンス ツールでは、この機能が既に利用されています。

データ ソース作成者による実装のためのインターフェイス

Windows フォーム コントロールは、次のインターフェイスを実装します。

  • IList インターフェイス

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

    Windows フォームとのバインド用にビジネス オブジェクトの一覧を作成する場合は、 BindingList<T>の使用を検討する必要があります。 BindingListは、双方向の Windows フォーム データ バインディングに必要なプライマリ インターフェイスを実装する拡張可能なクラスです。

  • IBindingList インターフェイス

    IBindingList インターフェイスを実装するクラスは、はるかに高いレベルのデータ バインディング機能を提供します。 この実装では、基本的な並べ替え機能と変更通知が提供されます。 両方とも、リスト アイテムが変更された場合や、リスト自体が変更された場合に便利です。 変更通知は、同じデータに複数のコントロールをバインドする場合に重要です。 これは、いずれかのコントロールで行われたデータ変更を行って、他のバインドされたコントロールに伝達するのに役立ちます。

    変更通知は、IBindingList プロパティを介してSupportsChangeNotification インターフェイスに対して有効になります。このプロパティをtrueすると、リストが変更されたか、リスト内の項目が変更されていることを示すListChanged イベントが発生します。

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

    BindingList<T>は、IBindingList インターフェイスの一般的な実装を提供します。

  • IBindingListView インターフェイス

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

  • IEditableObject インターフェイス

    IEditableObject インターフェイスを実装するクラスを使用すると、オブジェクトは、そのオブジェクトに対する変更が永続的になるタイミングを制御できます。 この実装では、 BeginEditEndEdit、および CancelEdit メソッドがサポートされています。これにより、オブジェクトに加えられた変更をロールバックできます。 次に、 BeginEditEndEdit、および CancelEdit メソッドの機能と、それらが相互に連携してデータに加えられた変更のロールバックを可能にする方法について簡単に説明します。

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

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

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

    BeginEditEndEdit、およびCancelEditメソッドの動作の詳細については、「データをデータベースに保存する」を参照してください。

    このデータ機能のトランザクション概念は、 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 インターフェイスを実装するクラスにより、リスト以外のオブジェクトに対するリスト ベースのバインドが可能になります。 GetListIListSourceメソッドは、IListから継承されないオブジェクトからバインド可能なリストを返すために使用されます。 IListSource は、 DataSet クラスによって使用されます。

  • IRaiseItemChangedEvents インターフェイス

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

    データ ソースが前に説明したイベント変換を一覧表示するプロパティを提供し、IRaiseItemChangedEvents コンポーネントと対話している場合は、BindingSourceを実装する必要があります。 それ以外の場合、 BindingSource はプロパティを実行してイベント変換を一覧表示し、パフォーマンスが低下します。

  • ISupportInitialize インターフェイス

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

    • BeginInit は、オブジェクトの初期化が開始されていることを通知します。

    • EndInit は、オブジェクトの初期化が完了していることを通知します。

  • ISupportInitializeNotification インターフェイス

    ISupportInitializeNotification インターフェイスを実装するコンポーネントは、ISupportInitialize インターフェイスも実装します。 このインターフェイスを使用すると、初期化が完了したことを他の ISupportInitialize コンポーネントに通知できます。 ISupportInitializeNotification インターフェイスには、次の 2 つのメンバーが含まれています。

    • IsInitialized は、コンポーネントが初期化されているかどうかを示す boolean 値を返します。

    • Initialized は、 EndInit が呼び出されたときに発生します。

  • INotifyPropertyChanged インターフェイス

    このインターフェイスを実装するクラスは、プロパティ値のいずれかが変更されたときにイベントを発生させる型です。 このインターフェイスは、コントロールのプロパティごとに変更イベントを持つパターンを置き換えるために設計されています。 BindingList<T>で使用する場合、ビジネス オブジェクトはINotifyPropertyChanged インターフェイスを実装する必要があり、BindingList'1 はPropertyChangedイベントをListChanged型のItemChangedイベントに変換します。

    バインドされたクライアントとデータ ソースの間のバインドで変更通知を行うには、バインドされたデータ ソース型で INotifyPropertyChanged インターフェイスを実装するか (推奨)、バインドされた型に propertyNameChanged イベントを指定する必要がありますが、両方を行わないでください。

コンポーネント作成者による実装のためのインターフェイス

次のインターフェイスは、Windows フォームのデータ バインディング エンジンによって使用されるように設計されています。

  • IBindableComponent インターフェイス

    このインターフェイスを実装するクラスは、データ バインディングをサポートする非制御コンポーネントです。 このクラスは、このインターフェイスの DataBindings プロパティと BindingContext プロパティを介して、コンポーネントのデータ バインディングとバインド コンテキストを返します。

    コンポーネントが Controlから継承している場合は、 IBindableComponent インターフェイスを実装する必要はありません。

  • ICurrencyManagerProvider インターフェイス

    ICurrencyManagerProvider インターフェイスを実装するクラスは、この特定のコンポーネントに関連付けられているバインドを管理するための独自のCurrencyManagerを提供するコンポーネントです。 カスタム CurrencyManager へのアクセスは、 CurrencyManager プロパティによって提供されます。

    Controlから継承するクラスは、BindingContext プロパティを介してバインドを自動的に管理するため、ICurrencyManagerProviderを実装する必要があるケースはまれです。

Windows フォームでサポートされるデータ ソース

従来、データ バインディングは、データベースに格納されているデータを利用するためにアプリケーション内で使用されていました。 Windows フォームのデータ バインディングを使用すると、特定の最小要件が満たされている限り、配列やコレクションなどの他の構造のデータベースやデータからデータにアクセスできます。

バインドする構造体

Windows フォームでは、単純なオブジェクト (単純なバインド) から、ADO.NET データ テーブル (複雑なバインド) などの複雑なリストまで、さまざまな構造体にバインドできます。 単純なバインドの場合、Windows フォームでは、単純なオブジェクトのパブリック プロパティへのバインドがサポートされます。 一般に、Windows フォームのリスト ベースのバインドでは、オブジェクトが IList インターフェイスまたは IListSource インターフェイスをサポートしている必要があります。 さらに、 BindingSource コンポーネントを介してバインドする場合は、 IEnumerable インターフェイスをサポートするオブジェクトにバインドできます。

次の一覧は、Windows フォームでバインドできる構造体を示しています。

  • BindingSource

    BindingSourceは最も一般的な Windows フォーム データ ソースであり、データ ソースと Windows フォーム コントロールの間のプロキシとして機能します。 一般的な BindingSource 使用パターンは、コントロールを BindingSource にバインドし、 BindingSource をデータ ソース (ADO.NET データ テーブルやビジネス オブジェクトなど) にバインドすることです。 BindingSourceは、データ バインディングサポートのレベルを有効にして向上させるサービスを提供します。 たとえば、 DataGridViewComboBox などの Windows フォーム リスト ベースのコントロールでは、 IEnumerable データ ソースへのバインドは直接サポートされませんが、このシナリオを有効にするには、 BindingSourceを使用してバインドします。 この場合、 BindingSource はデータ ソースを IListに変換します。

  • 単純なオブジェクト

    Windows フォームでは、 Binding 型を使用して、オブジェクトのインスタンスのパブリック プロパティに対するデータ バインディング コントロールプロパティをサポートしています。 Windows フォームでは、ListControlを使用する場合のオブジェクト インスタンスへのBindingSourceなど、リスト ベースのコントロールのバインドもサポートされています。

  • 配列またはコレクション

    データ ソースとして機能するには、リストで IList インターフェイスを実装する必要があります。1 つの例は、 Array クラスのインスタンスである配列です。 配列の詳細については、「 方法: オブジェクトの配列を作成する (Visual Basic)」を参照してください。

    一般に、データ バインディング用のオブジェクトの一覧を作成するときは、 BindingList<T> を使用する必要があります。 BindingList は、 IBindingList インターフェイスの汎用バージョンです。 IBindingList インターフェイスは、双方向データ バインディングに必要なプロパティ、メソッド、およびイベントを追加することで、IList インターフェイスを拡張します。

  • IEnumerable

    Windows フォーム コントロールは、IEnumerable コンポーネントを介してバインドされている場合にのみ、BindingSource インターフェイスをサポートするデータ ソースにバインドできます。

  • ADO.NET データオブジェクト

    ADO.NET には、バインドに適した多くのデータ構造が用意されています。 それぞれの高度さと複雑さが異なります。

    • DataColumn

      DataColumnは、複数の列がテーブルを構成するという点で、DataTableの重要な構成要素です。 各 DataColumn には、列が保持するデータの種類を決定する DataType プロパティがあります(たとえば、車を説明するテーブルでは自動車のメーカーを表します)。 コントロール ( TextBox コントロールの Text プロパティなど) をデータ テーブル内の列に簡単にバインドできます。

    • DataTable

      DataTableは、行と列を含むテーブルを ADO.NET で表現することです。 データ テーブルには 2 つのコレクションが含まれています。 DataColumn。特定のテーブル内のデータの列 (最終的にそのテーブルに入力できるデータの種類を決定します) を表し、 DataRow、特定のテーブル内のデータ行を表します。 コントロールをデータ テーブルに含まれる情報に複合バインドできます ( DataGridView コントロールをデータ テーブルにバインドするなど)。 ただし、 DataTableにバインドすると、テーブルの既定のビューにバインドされます。

    • DataView

      DataViewは、フィルター処理または並べ替え可能な 1 つのデータ テーブルのカスタマイズされたビューです。 データ ビューは、複合バインド コントロールによって使用されるデータ "スナップショット" です。 データ ビュー内のデータに単純にバインドしたり、複雑にバインドしたりすることはできますが、クリーンな更新データ ソースではなく、データの固定 "図" にバインドすることに注意してください。

    • DataSet

      DataSetは、データベース内のデータのテーブル、リレーションシップ、および制約のコレクションです。 データセット内のデータに単純バインドまたは複合バインドを行うことができますが、DataViewManagerの既定のDataSetにバインドされることに注意してください (次の箇条書きを参照)。

    • DataViewManager

      DataViewManagerは、DataSet全体のカスタマイズされたビューであり、DataViewに似ていますが、リレーションが含まれています。 DataViewSettings コレクションを使用すると、特定のテーブルに対してDataViewManagerが持つビューの既定のフィルターと並べ替えオプションを設定できます。

データ バインディングの種類

Windows フォームでは、単純バインディングと複合バインディングという 2 種類のデータ バインディングを利用できます。 それぞれに異なる利点があります。

データ バインディングの種類 説明
単純なデータ バインディング データセット テーブル内の列の値など、単一のデータ要素にバインドするコントロールの機能。 単純なデータ バインディングは、 TextBox コントロールや Label コントロールなどのコントロールに一般的なバインディングの種類です。これは、通常、1 つの値のみを表示するコントロールです。 実際、コントロールのプロパティは、データベース内のフィールドにバインドできます。 Visual Studio では、この機能に対する広範なサポートがあります。

詳細については、「 データの移動 」および「 単純バインド コントロールの作成 (Windows フォーム .NET)」を参照してください。
複雑なデータ バインディング 複数のデータ要素 (通常はデータベース内の複数のレコード) にバインドするコントロールの機能。 複雑なバインドは、リスト ベースのバインドとも呼ばれます。 複雑なバインドをサポートするコントロールの例としては、 DataGridViewListBox、および ComboBox コントロールがあります。 複雑なデータ バインディングの例については、「 方法: Windows フォーム ComboBox コントロールまたは ListBox コントロールをデータにバインドする」を参照してください。

ソース コンポーネントのバインド

データ バインディングを簡略化するために、Windows フォームを使用すると、データ ソースを BindingSource コンポーネントにバインドし、コントロールを BindingSourceにバインドできます。 この BindingSource は、単純または複雑なバインディング シナリオで使用できます。 いずれの場合も、 BindingSource は、変更通知通貨管理やその他のサービスを提供するデータ ソースとバインドされたコントロールの間の仲介役として機能します。

データ バインディングを使用する一般的なシナリオ

ほぼすべての商用アプリケーションは、1 つの種類または別のデータ ソースから読み取られた情報を使用します。通常は、データ バインディングを使用します。 次の一覧は、データの表示と操作の方法としてデータ バインディングを使用する最も一般的なシナリオをいくつか示しています。

シナリオ 説明
レポーティング レポートを使用すると、印刷されたドキュメント内のデータを柔軟に表示および集計できます。 データ ソースの選択した内容を画面またはプリンターに印刷するレポートを作成するのが一般的です。 一般的なレポートには、リスト、請求書、および概要が含まれます。 アイテムはリストの列に書式設定され、サブ項目は各リスト アイテムの下に整理されますが、データに最適なレイアウトを選択する必要があります。
データ入力 大量の関連データを入力したり、ユーザーに情報を求めたりする一般的な方法は、データ入力フォームを使用することです。 ユーザーは、テキスト ボックス、オプション ボタン、ドロップダウン リスト、およびチェック ボックスを使用して、情報を入力したり、選択肢を選択したりできます。 その後、情報が送信され、データベースに格納されます。データベースの構造は、入力された情報に基づいています。
マスター/詳細リレーションシップ マスター/詳細アプリケーションは、関連するデータを見るための 1 つの形式です。 具体的には、従来のビジネス例で接続するリレーションシップを持つデータのテーブルが 2 つあります。"Customers" テーブルと "Orders" テーブルには、顧客とそれぞれの注文をリンクするリレーションシップがあります。 2 つの Windows フォーム DataGridView コントロールを使用してマスター/詳細アプリケーションを作成する方法の詳細については、「 方法: 2 つの Windows フォーム DataGridView コントロールを使用してマスター/詳細フォームを作成する」を参照してください。
参照テーブル もう 1 つの一般的なデータ表示/操作シナリオは、テーブル参照です。 多くの場合、より大きなデータ表示の一部として、 ComboBox コントロールを使用してデータを表示および操作します。 重要なのは、 ComboBox コントロールに表示されるデータが、データベースに書き込まれるデータとは異なることがあります。 たとえば、食料品店から入手できるアイテムを表示する ComboBox コントロールがある場合は、おそらく製品の名前 (パン、牛乳、卵) を表示したいと考えます。 ただし、データベース内の情報の取得を容易にし、データベースの正規化のために、特定の注文の特定の項目の情報を項目番号 (#501、#603 など) として格納する可能性があります。 したがって、フォームの ComboBox コントロール内の食料品アイテムの "フレンドリ名" と、注文に存在する関連アイテム番号の間に暗黙的な接続があります。 これはテーブル参照の本質です。 詳細については、「 方法: Windows フォーム の BindingSource コンポーネントを使用して参照テーブルを作成する」を参照してください。

こちらも参照ください