チュートリアル : Word の操作ウィンドウ上のコントロールへのデータ バインディング
このチュートリアルでは、Microsoft Office Word の操作ウィンドウ内のコントロールに対するデータのバインドについて説明します。 このコントロールは、SQL Server データベースのテーブル間のマスター/詳細リレーションシップを示します。
対象: このトピックの情報は、Word 2007 と Word 2010 のドキュメント レベルのプロジェクトに適用されます。詳細については、「Office アプリケーションおよびプロジェクト タイプ別の使用可能な機能」を参照してください。
このチュートリアルでは、次の作業について説明します。
データにバインドされた Windows フォーム コントロールを含む操作ウィンドウを作成します。
マスター/詳細リレーションシップを使用してコントロール内にデータを表示します。
アプリケーションが開かれたときに操作ウィンドウを表示します。
注意
次の手順で参照している Visual Studio ユーザー インターフェイス要素の一部は、お使いのコンピューターでは名前や場所が異なる場合があります。 これらの要素は、使用する Visual Studio のエディションとその設定によって決まります。 詳細については、「設定の操作」を参照してください。
必須コンポーネント
このチュートリアルを実行するには、次のコンポーネントが必要です。
-
Microsoft Office 開発者ツールを含むエディションの Visual Studio 2010。 詳細については、「[Office ソリューションを開発できるようにコンピューターを構成する](bb398242\(v=vs.100\).md)」を参照してください。
Word 2007 または Word 2010
Northwind SQL Server サンプル データベースがインストールされたサーバーへのアクセス
SQL Server データベースの読み込み/書き込みアクセス許可
プロジェクトの作成
まず、Word 文書プロジェクトを作成します。
新しいプロジェクトを作成するには
My Word Actions Pane という名前の Word 文書プロジェクトを作成します。 ウィザードで、[新規ドキュメントの作成] をクリックします。
詳細については、「方法: Visual Studio で Office プロジェクトを作成する」を参照してください。
新しい Word 文書が Visual Studio のデザイナーに開かれ、My Word Actions Pane プロジェクトがソリューション エクスプローラーに追加されます。
操作ウィンドウへのコントロールの追加
このチュートリアルでは、データ バインド Windows フォーム コントロールがある操作ウィンドウ コントロールが必要です。 データ ソースをプロジェクトに追加し、[データ ソース] ウィンドウからコントロールを操作ウィンドウ コントロールにドラッグします。
操作ウィンドウ コントロールを追加するには
ソリューション エクスプローラーの [My Word Actions Pane] プロジェクトを選択します。
[プロジェクト] メニューの [新しい項目の追加] をクリックします。
[新しい項目の追加] ダイアログ ボックスの [操作ウィンドウ コントロール] をクリックし、コントロールに ActionsControl という名前を付けて [追加] をクリックします。
プロジェクトに新しいデータ ソースを追加するには
[データ ソース] ウィンドウが表示されていない場合は、[データ] メニューの [データ ソースの表示] をクリックします。
注意
[データ ソースの表示] が使用できない場合は、Word 文書をクリックしてから、再び確認してください。
[新しいデータ ソースの追加] をクリックしてデータ ソース構成ウィザードを起動します。
[データベース] をクリックし、[次へ] をクリックします。
SQL Server Northwind サンプル データベースへのデータ接続を選択するか、または [新しい接続] をクリックして新しい接続を追加します。
[次へ] をクリックします。
接続を保存するオプションがオンになっている場合はオフにし、[次へ] をクリックします。
[データベース オブジェクト] ウィンドウの [テーブル] ノードを展開します。
[Suppliers] テーブルと [Products] テーブルの横にあるチェック ボックスをオンにします。
[完了] をクリックします。
[Suppliers] テーブルと [Products] テーブルが [データ ソース] ウィンドウに追加されます。 さらに、ソリューション エクスプローラーに表示できる、型指定されたデータセットをプロジェクトに追加します。
データ バインド Windows フォーム コントロールを操作ウィンドウ コントロールに追加するには
[データ ソース] ウィンドウの [Suppliers] テーブルを展開します。
[会社名] ノードのドロップダウン矢印をクリックし、[ComboBox] をクリックします。
[データ ソース] ウィンドウの [CompanyName] を操作ウィンドウ コントロールにドラッグします。
ComboBox コントロールが、操作ウィンドウ コントロールに作成されます。 さらに、SuppliersBindingSource という BindingSource、テーブル アダプター、および DataSet がプロジェクトのコンポーネント トレイに追加されます。
[コンポーネント] トレイの SuppliersBindingNavigator を選択し、Del キーを押します。 このチュートリアルでは SuppliersBindingNavigator は使用しません。
注意
SuppliersBindingNavigator を削除しても、それのために作成されたすべてのコードは削除されません。 このコードは削除できます。
コンボ ボックスをラベルの下へ移動して、[Size] プロパティを 171, 21 に変更します。
[データ ソース] ウィンドウで、[Suppliers] テーブルの子である [Products] テーブルを展開します。
[ProductName] ノードのドロップダウン矢印をクリックし、[ListBox] をクリックします。
[ProductName] を操作ウィンドウ コントロールにドラッグします。
ListBox コントロールが、操作ウィンドウ コントロールに作成されます。 それと同時に、ProductBindingSource という BindingSource とテーブル アダプターがプロジェクトのコンポーネント トレイに追加されます。
リスト ボックスをラベルの下へ移動して、[Size] プロパティを 171, 95 に変更します。
ツールボックスから Button を操作ウィンドウ コントロールにドラッグし、リスト ボックスの下に配置します。
Button を右クリックし、ショートカット メニューの [プロパティ] をクリックし、次のプロパティを変更します。
プロパティ
値
Name
Insert
Text
Insert
ユーザー コントロールのサイズをコントロールと同じ大きさに変更します。
データ ソースの設定
データ ソースをセットアップするには、操作ウィンドウ コントロールの Load イベントに DataTable からデータを取得してコントロールに読み込むコードを追加し、各コントロールに対して DataSource プロパティと DataMember プロパティを設定します。
コントロールにデータを読み込むには
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); }
C# では、イベント ハンドラーを Load イベントに追加する必要があります。 InitializeComponent の呼び出しの後に、このコードを ActionsControl コンストラクターに追加できます。 イベント ハンドラーを作成する方法の詳細については、「方法: Office プロジェクトでイベント ハンドラーを作成する」を参照してください。
this.Load += new EventHandler(ActionsControl_Load);
コントロールのデータ バインド プロパティを設定するには
CompanyNameComboBox コントロールを選択します。
[プロパティ] ウィンドウの DataSource プロパティの右側にあるボタンをクリックし、[suppliersBindingSource] をクリックします。
[DisplayMember] プロパティの右側にあるボタンをクリックし、[CompanyName] をクリックします。
[DataBindings] プロパティを展開し、[Text] プロパティの右側にあるボタンをクリックして、[None] をクリックします。
ProductNameListBox コントロールを選択します。
[プロパティ] ウィンドウの DataSource プロパティの右側にあるボタンをクリックし、[productsBindingSource] をクリックします。
[DisplayMember] プロパティの右側にあるボタンをクリックし、[ProductName] をクリックします。
[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 テーブルにテキストを挿入するには
[挿入] ボタンの 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); } }
C# では、ボタンの Click イベントにイベント ハンドラーを作成する必要があります。 このコードは、ActionsControl クラスの Load イベント ハンドラーに配置できます。
this.Insert.Click += new EventHandler(Insert_Click);
操作ウィンドウの表示
操作ウィンドウは、コントロールが追加された後で表示されます。
操作ウィンドウを表示するには
ソリューション エクスプローラーの ThisDocument.vb または ThisDocument.cs を右クリックし、ショートカット メニューの [コードの表示] をクリックします。
次のコード例に示すように、コントロールの新しいインスタンスを ThisDocument クラスの先頭で作成します。
Dim actions As New ActionsControl
private ActionsControl actions = new ActionsControl();
次のコード例に示すように、ThisDocument の Startup イベント ハンドラーにコードを追加します。
Me.ActionsPane.Controls.Add(actions)
this.ActionsPane.Controls.Add(actions);
アプリケーションのテスト
文書をテストして、文書を開いたときに操作ウィンドウが表示されることを確認します。 操作ウィンドウ内のコントロールのマスター/詳細リレーションシップをテストし、[Insert] ボタンのクリック時にデータが Word 文書に読み込まれることを確認します。
文書をテストするには
F5 キーを押してプロジェクトを実行します。
操作ウィンドウが表示されることを確認します。
コンボ ボックスで会社を選択し、[Products] ボックスの一覧の内容が変更されることを確認します。
製品を選択し、操作ウィンドウの [Insert] をクリックして、Word 内のテーブルに製品の詳細な情報が追加されることを確認します。
他の製品を複数の会社から挿入します。
次の手順
このチュートリアルは、Word の操作ウィンドウ内のコントロールにデータをバインドする方法の基本事項を説明します。 ここでは、次の作業を行います。
Excel のコントロールへのデータのバインド。 詳細については、「チュートリアル : Excel のアクション ペインのコントロールへのデータ連結」を参照してください。
操作ウィンドウ上のコントロールの表示および非表示。 詳細については、「チュートリアル : ユーザー コンテキストに応じた操作ウィンドウの変更」を参照してください。
プロジェクトの配置。 詳細については、「配置の概要 (Visual Studio での Office 開発)」を参照してください。