Office ソリューションでコントロールにデータをバインドする

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

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

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

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

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

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

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

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

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

単純データ バインディングについて説明しているチュートリアルについては、「チュートリアル: ドキュメント レベルのプロジェクトでの単純データ バインディング」(ドキュメント レベルのプロジェクトの場合) と、「チュートリアル: VSTO アドイン プロジェクトでの単純データ バインディング」(VSTO アドイン プロジェクトの場合) をご覧ください。

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

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

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

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

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 フォーム コントロールのバインド」および「新しいデータ ソースの追加」をご覧ください。

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

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

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

ContentControl コントロールが文書に追加されます。 コンテンツ コントロールの種類は、選んだフィールドのデータ型によって異なります。

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

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

VSTO アドイン プロジェクトでデータをバインドする

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

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

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

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

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

詳しくは、「方法: ホスト コントロールのデータでデータ ソースを更新する」をご覧ください。