チュートリアル : Word の操作ウィンドウ上のコントロールへのデータ バインディング

更新 : 2007 年 11 月

対象

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

プロジェクトの種類

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

Microsoft Office のバージョン

  • Word 2007

  • Word 2003

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

このチュートリアルでは、Microsoft Office Word の操作ウィンドウ内のコントロールに対するデータのバインドについて説明します。このコントロールは、SQL Server データベースのテーブル間のマスター/詳細リレーションシップを示します。

このチュートリアルでは、次のタスクについて説明します。

  • データにバインドされた Windows フォーム コントロールを含む操作ウィンドウを作成します。

  • マスター/詳細リレーションシップを使用してコントロール内にデータを表示します。

  • アプリケーションが開かれたときに操作ウィンドウを表示します。

ms178783.alert_note(ja-jp,VS.90).gifメモ :

次の手順で参照している Visual Studio ユーザー インターフェイス要素の一部は、お使いのコンピュータでは名前や場所が異なる場合があります。これらの要素は、使用する Visual Studio のエディションとその設定によって決まります。詳細については、「Visual Studio の設定」を参照してください。

前提条件

このチュートリアルを完了するには、次のコンポーネントが必要です。

  • Visual Studio Tools for Office (Visual Studio 2008 Professional および Visual Studio Team System のオプションの要素)

  • Microsoft Office Word 2003 または Microsoft Office Word 2007

  • Northwind SQL Server サンプル データベースがインストールされたサーバーへのアクセス

  • SQL Server データベースの読み込み/書き込みアクセス許可

ここに挙げた Visual Studio のバージョンでは、Visual Studio Tools for Office が既定でインストールされます。インストールされているかどうかを確認する方法については、「Visual Studio Tools for Office のインストール」を参照してください。

プロジェクトの作成

まず、Word 文書プロジェクトを作成します。

新しいプロジェクトを作成するには

  • My Word Actions Pane という名前の Word 文書プロジェクトを作成します。ウィザードで、[新規ドキュメントの作成] をクリックします。

    詳細については、「方法 : Visual Studio Tools for Office プロジェクトを作成する」を参照してください。

    新しい Word 文書が Visual Studio のデザイナに開かれ、My Word Actions Pane プロジェクトがソリューション エクスプローラに追加されます。

操作ウィンドウへのコントロールの追加

このチュートリアルでは、データ バインド Windows フォーム コントロールがある操作ウィンドウ コントロールが必要です。データ ソースをプロジェクトに追加し、[データ ソース] ウィンドウからコントロールを操作ウィンドウ コントロールにドラッグします。

操作ウィンドウ コントロールを追加するには

  1. ソリューション エクスプローラ[My Word Actions Pane] プロジェクトを選択します。

  2. [プロジェクト] メニューの [新しい項目の追加] をクリックします。

  3. [新しい項目の追加] ダイアログ ボックスの [操作ウィンドウ コントロール] をクリックし、コントロールに ActionsControl という名前を付けて [追加] をクリックします。

プロジェクトに新しいデータ ソースを追加するには

  1. [データ ソース] ウィンドウが表示されていない場合は、[データ] メニューの [データ ソースの表示] をクリックします。

    ms178783.alert_note(ja-jp,VS.90).gifメモ :

    [データ ソースの表示] が使用できない場合は、Word 文書をクリックしてから、再び確認してください。

  2. [新しいデータ ソースの追加] をクリックしてデータ ソース構成ウィザードを起動します。

  3. [データベース] をクリックし、[次へ] をクリックします。

  4. SQL Server Northwind サンプル データベースへのデータ接続を選択するか、または [新しい接続] をクリックして新しい接続を追加します。

  5. [次へ] をクリックします。

  6. 接続を保存するオプションがオンになっている場合はオフにし、[次へ] をクリックします。

  7. [データベース オブジェクト] ウィンドウの [テーブル] ノードを展開します。

  8. [Suppliers] テーブルと [Products] テーブルの横にあるチェック ボックスをオンにします。

  9. [完了] をクリックします。

[Suppliers] テーブルと [Products] テーブルが [データ ソース] ウィンドウに追加されます。さらに、ソリューション エクスプローラに表示できる、型指定されたデータセットをプロジェクトに追加します。

データ バインド Windows フォーム コントロールを操作ウィンドウ コントロールに追加するには

  1. [データ ソース] ウィンドウの [Suppliers] テーブルを展開します。

  2. [会社名] ノードのドロップダウン矢印をクリックし、[ComboBox] をクリックします。

  3. [データ ソース] ウィンドウの [CompanyName] を操作ウィンドウ コントロールにドラッグします。

    ComboBox コントロールが、操作ウィンドウ コントロールに作成されます。さらに、SuppliersBindingSource という BindingSource、テーブル アダプタ、および DataSet がプロジェクトのコンポーネント トレイに追加されます。

  4. [コンポーネント] トレイの SuppliersBindingNavigator を選択し、Del キーを押します。このチュートリアルでは SuppliersBindingNavigator は使用しません。

    ms178783.alert_note(ja-jp,VS.90).gifメモ :

    SuppliersBindingNavigator を削除しても、それのために作成されたすべてのコードは削除されません。このコードは削除できます。

  5. コンボ ボックスをラベルの下に移動して、Size プロパティを 171, 21 に変更します。

  6. [データ ソース] ウィンドウで、[Suppliers] テーブルの子である [Products] テーブルを展開します。

  7. [ProductName] ノードのドロップダウン矢印をクリックし、[ListBox] をクリックします。

  8. [ProductName] を操作ウィンドウ コントロールにドラッグします。

    ListBox コントロールが、操作ウィンドウ コントロールに作成されます。それと同時に、ProductBindingSource という BindingSource とテーブル アダプタがプロジェクトのコンポーネント トレイに追加されます。

  9. リスト ボックスをラベルの下に移動して、Size プロパティを 171,95 に変更します。

  10. ツールボックスから Button を操作ウィンドウ コントロールにドラッグし、リスト ボックスの下に配置します。

  11. Button を右クリックし、ショートカット メニューの [プロパティ] をクリックし、次のプロパティを変更します。

    プロパティ

    Name

    Insert

    Text

    Insert

  12. ユーザー コントロールのサイズをコントロールと同じ大きさに変更します。

データ ソースの設定

データ ソースをセットアップするには、操作ウィンドウ コントロールの Load イベントに DataTable からデータを取得してコントロールに読み込むコードを追加し、各コントロールに対して DataSource プロパティと DataMember プロパティを設定します。

コントロールにデータを読み込むには

  1. ActionsControl クラスの Load イベント ハンドラに次のコードを追加します。

    Private Sub ActionsControl_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles Me.Load
    
        Me.SuppliersTableAdapter.Fill(Me.NorthwindDataSet.Suppliers)
        Me.ProductsTableAdapter.Fill(Me.NorthwindDataSet.Products)
    End Sub
    
    private void ActionsControl_Load(object sender, EventArgs e)
    {
        this.suppliersTableAdapter.Fill(this.northwindDataSet.Suppliers);
        this.productsTableAdapter.Fill(this.northwindDataSet.Products);
    }
    
  2. C# では、イベント ハンドラを Load イベントに追加する必要があります。InitializeComponent の呼び出しの後に、このコードを ActionsControl コンストラクタに追加できます。イベント ハンドラを作成する方法の詳細については、「方法 : Visual Studio Tools for Office でイベント ハンドラを作成する」を参照してください。

    this.Load += new EventHandler(ActionsControl_Load);
    

コントロールのデータ バインド プロパティを設定するには

  1. CompanyNameComboBox コントロールを選択します。

  2. [プロパティ] ウィンドウの DataSource プロパティの右側にあるボタンをクリックし、[suppliersBindingSource] をクリックします。

  3. [DisplayMember] プロパティの右側にあるボタンをクリックし、[CompanyName] をクリックします。

  4. [DataBindings] プロパティを展開し、[Text] プロパティの右側にあるボタンをクリックして、[None] をクリックします。

  5. ProductNameListBox コントロールを選択します。

  6. [プロパティ] ウィンドウの DataSource プロパティの右側にあるボタンをクリックし、[productsBindingSource] をクリックします。

  7. [DisplayMember] プロパティの右側にあるボタンをクリックし、[ProductName] をクリックします。

  8. [DataBindings] プロパティを展開し、[SelectedValue] プロパティの右側にあるボタンをクリックして、[None] をクリックします。

データをテーブルに挿入するメソッドの追加

次に、バインド コントロールからデータを読み取り、Word 文書内のテーブルに読み込みます。まず、テーブルの見出しの書式を指定するためのプロシージャを作成し、次に Word テーブルを作成して書式を指定する AddData メソッドを追加します。

テーブルの見出しの書式を指定するには

  • ActionsControl クラスに、テーブルの見出しの書式を指定するメソッドを作成します。

    Shared Sub SetHeadings(ByVal tblCell As Word.Cell, ByVal text As String)
    
        With tblCell.Range
            .Text = text
            .Font.Bold = True
            .ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter
        End With
    End Sub
    
    static void SetHeadings(Microsoft.Office.Interop.Word.Cell tblCell, string text)
    {
        tblCell.Range.Text = text;
        tblCell.Range.Font.Bold = 1;
        tblCell.Range.ParagraphFormat.Alignment = 
            Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphCenter;
    }
    

テーブルを作成するには

  • テーブルが存在しない場合にテーブルを作成し、操作ウィンドウからデータをこのテーブルに追加するメソッドを ActionsControl クラスに作成します。

    Private Sub AddData(ByVal row As System.Data.DataRow, ByVal companyName As String)
    
        ' Create a table if it doesn't already exist.
        If Globals.ThisDocument.Tables.Count = 0 Then
    
            Try
                ' Create a table. 
                Dim tbl As Word.Table = Globals.ThisDocument.Tables.Add( _
                    Globals.ThisDocument.Application.Selection.Range, 1, 4)
    
                ' Insert headings.
                SetHeadings(tbl.Cell(1, 1), "Company Name")
                SetHeadings(tbl.Cell(1, 2), "Product Name")
                SetHeadings(tbl.Cell(1, 3), "Quantity")
                SetHeadings(tbl.Cell(1, 4), "Unit Price")
    
            Catch ex As Exception
                MessageBox.Show("Problem creating Products table: " & ex.Message, _
                    "Actions Pane", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End If
    
        ' Add data from data row to the table.
        Dim selection As Word.Selection = Globals.ThisDocument.Application.Selection
    
        If selection.Tables.Count > 0 Then
    
            Dim newRow As Word.Row = Globals.ThisDocument.Tables(1).Rows.Add()
            With newRow
                .Range.Font.Bold = False
                .Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft
                .Cells(4).Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight
                .Cells(1).Range.Text = companyName
                .Cells(2).Range.Text = row.Item("ProductName").ToString
                .Cells(3).Range.Text = row.Item("QuantityPerUnit").ToString
                .Cells(4).Range.Text = Math.Round(row.Item("UnitPrice"), 2)
            End With
    
        Else
            MessageBox.Show("Cursor must be within a table.", _
                "Actions Pane", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End If
    End Sub
    
    private void AddData(System.Data.DataRow row, string companyName)
    {
        object missing = System.Type.Missing;
    
        // Create a table if it doesn't already exist.
        if (Globals.ThisDocument.Tables.Count == 0)
        {
            try
            {
                // Create a table.
                Microsoft.Office.Interop.Word.Table tbl = Globals.ThisDocument.Tables.Add
                    (Globals.ThisDocument.Application.Selection.Range, 1, 4, ref missing, ref missing);
    
                // Insert headings.
                SetHeadings(tbl.Cell(1, 1), "Company Name");
                SetHeadings(tbl.Cell(1, 2), "Product Name");
                SetHeadings(tbl.Cell(1, 3), "Quantity");
                SetHeadings(tbl.Cell(1, 4), "Unit Price");
            }
            catch (Exception ex)
            {
                MessageBox.Show("Problem creating Products table: " + ex.Message, 
                    "Actions Pane", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    
        // Add data from data row to the table.
        Microsoft.Office.Interop.Word.Selection selection = Globals.ThisDocument.Application.Selection;
    
        if (selection.Tables.Count > 0)
        {
            Microsoft.Office.Interop.Word.Row newRow = Globals.ThisDocument.Tables[1].Rows.Add(ref missing);
    
            newRow.Range.Font.Bold = 0;
    
            newRow.Range.ParagraphFormat.Alignment = 
                Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphLeft;
    
            newRow.Cells[4].Range.ParagraphFormat.Alignment =
                Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphRight;
    
            newRow.Cells[1].Range.Text = companyName;
            newRow.Cells[2].Range.Text = row["ProductName"].ToString();
            newRow.Cells[3].Range.Text = row["QuantityPerUnit"].ToString();
            newRow.Cells[4].Range.Text = Math.Round(Convert.ToDouble(row["UnitPrice"])).ToString("#,##0.00");
        }
        else
        {
            MessageBox.Show("Cursor must be within a table.", 
                "Actions Pane", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
    

Word テーブルにテキストを挿入するには

  1. [挿入] ボタンの Click イベント ハンドラに次のコードを追加します。

    Private Sub Insert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Insert.Click
    
        Dim tbl As System.Data.DataTable = NorthwindDataSet.Products
        Dim rows() As System.Data.DataRow
    
        ' Check if a product is selected.
        If Not Me.ProductNameListBox.SelectedIndex < 0 Then
    
            Dim product As String = Me.ProductNameListBox.SelectedItem.Row.Item("ProductName")
            Dim company As String = Me.CompanyNameComboBox.Text
    
            ' Return the data row from the selected Product in the list box.
            rows = tbl.Select("[ProductName] = '" & product.Replace("'", "''") & "'")
    
            AddData(rows(0), company)
    
        Else
            MessageBox.Show("Please select a product.", "Actions Pane", MessageBoxButtons.OK)
        End If
    End Sub
    
    private void Insert_Click(object sender, System.EventArgs e)
    {
        System.Data.DataTable tbl = northwindDataSet.Products;
        System.Data.DataRow[] rows;
    
        // Check if a product is selected.
        if (this.productNameListBox.SelectedIndex >= 0)
        {
            System.Data.DataRowView productRow = (System.Data.DataRowView)this.productNameListBox.SelectedItem;
    
            string product = productRow.Row["ProductName"].ToString();
            string company = this.companyNameComboBox.Text;
    
            // Return the data row from the selected product.
            rows = tbl.Select("[ProductName] = '" + product.Replace("'", "''") + "'");
    
            this.AddData(rows[0], company);
        }
        else
        {
            MessageBox.Show("Please select a product.", "Actions Pane", MessageBoxButtons.OK);
        }
    }
    
  2. C# では、ボタンの Click イベントにイベント ハンドラを作成する必要があります。このコードは、ActionsControl クラスの Load イベント ハンドラに配置できます。

    this.Insert.Click += new EventHandler(Insert_Click);
    

操作ウィンドウの表示

操作ウィンドウは、コントロールが追加された後で表示されます。

操作ウィンドウを表示するには

  1. ソリューション エクスプローラThisDocument.vb または ThisDocument.cs を右クリックし、ショートカット メニューの [コードの表示] をクリックします。

  2. 次のコード例に示すように、コントロールの新しいインスタンスを ThisDocument クラスの先頭で作成します。

    Dim actions As New ActionsControl
    
    private ActionsControl actions = new ActionsControl();
    
  3. 次のコード例に示すように、ThisDocument の Startup イベント ハンドラにコードを追加します。

    Me.ActionsPane.Controls.Add(actions)
    
    this.ActionsPane.Controls.Add(actions);
    

アプリケーションのテスト

文書をテストして、文書を開いたときに操作ウィンドウが表示されることを確認します。操作ウィンドウ内のコントロールのマスター/詳細リレーションシップをテストし、[Insert] ボタンのクリック時にデータが Word 文書に読み込まれることを確認します。

文書をテストするには

  1. F5 キーを押してプロジェクトを実行します。

  2. 操作ウィンドウが表示されることを確認します。

  3. コンボ ボックスで会社を選択し、[Products] ボックスの一覧の内容が変更されることを確認します。

  4. 製品を選択し、操作ウィンドウの [Insert] をクリックして、Word 内のテーブルに製品の詳細な情報が追加されることを確認します。

  5. 他の製品を複数の会社から挿入します。

次の手順

このチュートリアルは、Word の操作ウィンドウ内のコントロールにデータをバインドする方法の基本事項を説明します。次に行う作業は以下のとおりです。

参照

処理手順

方法 : Word 文書に操作ウィンドウを追加する

概念

操作ウィンドウの概要

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