次の方法で共有


Office ソリューションでのコントロールへのデータのバインド

Microsoft Office Word 文書または Microsoft Office Excel ワークシート上の Windows フォーム コントロールやホスト コントロールを、データ ソースにバインドすることができます。この場合、コントロールには自動的にデータが表示されます。アプリケーション レベルのプロジェクトとドキュメント レベルのプロジェクトの両方で、コントロールにデータをバインドできます。

対象: このトピックの情報は、Office 2013 および Office 2010 のドキュメント レベルのプロジェクトおよびアプリケーション レベルのプロジェクトに適用されます。詳細については、「Office アプリケーションおよびプロジェクト タイプ別の使用可能な機能」を参照してください。

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

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

ビデオへのリンク 関連のビデオ デモについては、「How Do I: Consume Database Data in Excel? (操作方法: Excel でデータベースのデータを使用する)」を参照してください。

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

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

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

ドキュメント レベルのプロジェクトにあるデータ要素に Value2 プロパティをバインドする方法を、次の例に示します。

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"], "Customers");

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

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

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

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

ad7sfx3w.collapse_all(ja-jp,VS.110).gif[データ ソース] ウィンドウからのコントロールのドラッグ

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

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

ContentControl コントロールがドキュメントに追加されます。コンテンツ コントロールの種類は、選択したフィールドのデータ型によって異なります。

ad7sfx3w.collapse_all(ja-jp,VS.110).gifデザイン時におけるドキュメント レベルのプロジェクトでのデータのバインド

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

ad7sfx3w.collapse_all(ja-jp,VS.110).gifアプリケーション レベルのプロジェクトでのデータのバインド

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

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

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

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

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

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

参照

処理手順

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

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

概念

データ連結と Windows フォーム

Visual Studio でのデータへの Windows フォーム コントロールのバインド

データセットのデータの保存

キャッシュされたデータ

その他の技術情報

How Do I: Excelのデータベースのデータを実行します。

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