次の方法で共有


コントロールへのデータのバインド

更新 : 2008 年 7 月

対象

このトピックの情報は、指定された Visual Studio Tools for Office プロジェクトおよび Microsoft Office のバージョンにのみ適用されます。

ドキュメント レベルのプロジェクト

  • Excel 2003

  • Excel 2007

  • Word 2003

  • Word 2007

アプリケーション レベルのプロジェクト

  • Excel 2007

  • Word 2007

詳細については、「アプリケーションおよびプロジェクトの種類別の使用可能な機能」を参照してください。

Microsoft Office Word 文書または Microsoft Office Excel ワークシート上の Windows フォーム コントロールやホスト コントロールを、データ ソースにバインドすることができます。この場合、コントロールには自動的にデータが表示されます。

Visual Studio 2008 Service Pack 1 (SP1) 以降、アプリケーション レベルのプロジェクトのコントロールにデータをバインドできるようになりました。SP1 をインストールしていない場合、データはドキュメント レベルのプロジェクトでのみコントロールにバインドできます。

ホスト コントロールは、Word や Excel のオブジェクト モデルにあるオブジェクトを拡張します。たとえば、Word のコンテンツ コントロールや Excel の名前付き範囲が挙げられます。詳細については、「ホスト項目とホスト コントロールの概要」を参照してください。

Windows フォーム コントロールとホスト コントロールはいずれも Windows フォームのデータ バインディング モデルを使用します。このモデルでは、データセットやデータ テーブルなどのデータ ソースに対して単純データ バインディングと複合データ バインディングの両方がサポートされます。Windows フォームでのデータ バインディング モデルの詳細については、「データ連結と Windows フォーム」を参照してください。

単純データ バインディング

単純データ バインディングは、コントロール プロパティが、データ テーブル内の値など、単一のデータ要素にバインドされる場合に存在します。たとえば、NamedRange コントロールは、データセット内のフィールドにバインドできる Value2 プロパティを持ちます。データセット内のフィールドが変更されると、名前付き範囲内の値も変更されます。XMLNodes コントロールを除くすべてのホスト コントロールが、単純データ バインディングをサポートしています。XMLNodes コントロールはコレクションであるため、データ バインディングをサポートしません。

ホスト コントロールへの単純データ バインディングを実行するには、コントロールの DataBindings プロパティに Binding を追加します。Binding オブジェクトは、コントロールのプロパティ値とデータ要素の値との間の単純バインディングを表します。

ドキュメント レベルのプロジェクトにあるデータ要素に Value2 プロパティをバインドする方法を、次の例に示します。このコード例は、DataBindings プロパティのトピックで提供されているコード例の一部分です。

Dim binding1 As New Binding("Value2", ds, "Customers.Names", True)
namedRange1.DataBindings.Add(binding1)
Binding binding1 = new Binding("Value2", ds, "Customers.Names", true);
namedRange1.DataBindings.Add(binding1);

単純データ バインディングを示すチュートリアルについては、「チュートリアル : ドキュメント レベルのプロジェクトでの単純データ バインディング」(ドキュメント レベルのプロジェクトの場合) および「チュートリアル : アプリケーション レベルのプロジェクトでの単純データ バインディング」(アプリケーション レベルのプロジェクトの場合) を参照してください。

複合データ バインディング

複合データ バインディングは、コントロール プロパティが、データ テーブル内の複数の列など、複数のデータ要素にバインドされる場合に存在します。Excel の ListObject コントロールには、複合データ バインディングをサポートするホスト コントロールしかありません。ただし、複合データ バインディングをサポートする Windows フォーム コントロールが数多くあります (DataGridView コントロールなど)。

複合データ バインディングを実行するには、コントロールの DataSource プロパティを、複合データ バインディングでサポートされるデータ ソース オブジェクトに設定します。たとえば、ListObject コントロールの DataSource プロパティは、データ テーブル内の複数の列にバインドできます。データ テーブル内のすべてのデータは ListObject コントロールに表示され、データ テーブル内のデータが変更されると、ListObject も変更されます。複合データ バインディングに使用できるデータ ソースの一覧については、「Windows フォームがサポートするデータ ソース」を参照してください。

次のコード例は、2 つの DataTable オブジェクトを持つ DataSet を作成し、そのうち 1 つのテーブルにデータを入力します。次に、データを含むテーブルに ListObject をバインドします。これは、Excel のドキュメント レベルのプロジェクト用の例です。

Private Sub ListObject_DataSourceAndMember()
    ' Create a DataSet and two DataTables.
    Dim ordersDataSet As New DataSet("ordersDataSet")
    Dim tableCustomers As New DataTable("Customers")
    Dim tableProducts As New DataTable("Products")
    ordersDataSet.Tables.Add(tableCustomers)
    ordersDataSet.Tables.Add(tableProducts)

    ' Add a data to the Customers DataTable.
    tableCustomers.Columns.Add(New DataColumn("LastName"))
    tableCustomers.Columns.Add(New DataColumn("FirstName"))
    Dim dr As DataRow = tableCustomers.NewRow()
    dr("LastName") = "Chan"
    dr("FirstName") = "Gareth"
    tableCustomers.Rows.Add(dr)

    ' Create a list object.
    Dim List1 As Microsoft.Office.Tools.Excel.ListObject = _
        Me.Controls.AddListObject(Me.Range( _
        "A1"), "Customers")

    ' Bind the list object to the Customers table.
    List1.AutoSetDataBoundColumnHeaders = True
    List1.DataSource = ordersDataSet
    List1.DataMember = "Customers"

End Sub

private void ListObject_DataSourceAndMember()
{
    // Create a DataSet and two DataTables.
    DataSet ordersDataSet = new DataSet("ordersDataSet");
    DataTable tableCustomers = new DataTable("Customers");
    DataTable tableProducts = new DataTable("Products");
    ordersDataSet.Tables.Add(tableCustomers);
    ordersDataSet.Tables.Add(tableProducts);

    // Add a data to the Customers DataTable.
    tableCustomers.Columns.Add(new DataColumn("LastName"));
    tableCustomers.Columns.Add(new DataColumn("FirstName"));
    DataRow dr = tableCustomers.NewRow();
    dr["LastName"] = "Chan";
    dr["FirstName"] = "Gareth";
    tableCustomers.Rows.Add(dr);

    // Create a list object.
    Microsoft.Office.Tools.Excel.ListObject list1 = 
        this.Controls.AddListObject(
        this.Range["A1", missing], "Customers");

    // Bind the list object to the Customers table.
    list1.AutoSetDataBoundColumnHeaders = true;
    list1.DataSource = ordersDataSet;
    list1.DataMember = "Customers";
}

複合データ バインディングを示すチュートリアルについては、「チュートリアル : ドキュメント レベルのプロジェクトでの複合データ バインディング」(ドキュメント レベルのプロジェクトの場合) および「チュートリアル : アプリケーション レベルのプロジェクトでの複合データ バインディング」(アプリケーション レベルのプロジェクトの場合) を参照してください。

文書およびブック内のデータの表示

ドキュメント レベルのプロジェクトでは、Windows フォームで使用する場合と同じように [データ ソース] ウィンドウを使用して、文書やブックにデータ バインド コントロールを簡単に追加できます。[データ ソース] ウィンドウの使用方法の詳細については、「データの表示の概要」および「[データ ソース] ウィンドウ」を参照してください。

[データ ソース] ウィンドウからのコントロールのドラッグ

[データ ソース] ウィンドウからオブジェクトをドラッグすると、ドキュメントにコントロールが作成されます。作成されるコントロールの種類は、単一のデータ列をバインドするか、複数のデータ列をバインドするかによって異なります。

Excel の場合、NamedRange コントロールがワークシートを構成するフィールドごとに作成され、ListObject コントロールが複数の行と列を含むデータ範囲ごとに作成されます。この既定を変更するには、[データ ソース] ウィンドウでテーブルまたはフィールドを選択し、ドロップダウン リストで別のコントロールを選択します。

Word 2007 の場合は、ContentControl コントロールが文書に追加されます。コンテンツ コントロールの種類は、選択したフィールドのデータ型によって異なります。Word 2003 の場合は、Bookmark コントロールが文書に追加されます。

デザイン時におけるドキュメント レベルのプロジェクトでのデータのバインド

以下のトピックでは、デザイン時にデータをバインドする例を示しています。

アプリケーション レベルのプロジェクトでのデータのバインド

アプリケーション レベルのプロジェクトでは、コントロールを追加できるのは実行時だけです。以下のトピックでは、実行時にデータをバインドする例を示しています。

ホスト コントロールにバインドされているデータの更新

データ ソースとホスト コントロールの間のデータ バインディングでは、双方向のデータ更新が必要です。単純データ バインディングでは、データ ソースでの変更は自動的にホスト コントロールに反映されますが、ホスト コントロールでの変更の場合、明示的な呼び出しによってデータ ソースを更新する必要があります。これは、別のデータ バインド フィールドで行われた変更が伴わない限り、データ バインド フィールドで行われた変更が受け付けられないことがあるためです。たとえば、2 つのフィールドがあり、1 つは年齢、1 つは経験年数を示すものとします。経験年数が年齢を上回ることはありません。同時に変更しない限り、年齢を 50 から 25 に更新し、経験年数を 30 から 10 に更新することはできません。この問題を解決するために、単純データ バインディングのフィールドは、変更がコードで明示的に送信されるまで更新されないようになっています。

単純データ バインディングを有効にしているホスト コントロールからデータ ソースを更新するには、更新をインメモリ データ ソース (DataSetDataTable など) に送信する必要があります。ソリューションでバックエンド データベースを使用している場合は、バックエンド データベースにも更新を送信する必要があります。

ListObject コントロールを使用して複合データ バインディングを実行するときは、インメモリ データ ソースを明示的に更新する必要はありません。この場合には、コードを追加しなくても、インメモリ データ ソースに変更が自動的に送信されます。

詳細については、「方法 : ホスト コントロールからのデータでデータ ソースを更新する」を参照してください。

参照

処理手順

方法 : Windows フォームに単純バインド コントロールを作成する

方法 : TableAdapter を使用してデータを更新する

概念

データ連結と Windows フォーム

データの表示の概要

データ保存の概要

キャッシュされたデータ

その他の技術情報

ADO.NET における同時実行制御

Office ソリューションにおけるデータ

履歴の変更

日付

履歴

理由

2008 年 7 月

アプリケーション レベルのアドインでのデータ バインディングに関する情報を追加

SP1 機能変更