チュートリアル : カスタム XML 部分へのコンテンツ コントロールのバインド
このチュートリアルでは、Word のドキュメント レベルのカスタマイズで、コンテンツ コントロールを同じ文書内の XML データにバインドする方法を説明します。
対象: このトピックの情報は、Word 2013 と Word 2010 のドキュメント レベルのプロジェクトに適用されます。詳細については、「Office アプリケーションおよびプロジェクト タイプ別の使用可能な機能」を参照してください。
Word では、カスタム XML 部分と呼ばれる XML データを文書内に格納できます。このデータの表示は、カスタム XML 部分の要素にコンテンツ コントロールをバインドすることによって制御できます。このチュートリアルで例として示す文書のカスタム XML 部分には、従業員情報が格納されています。この文書を開くと、XML 要素の値がコンテンツ コントロールに表示されます。コンテンツ コントロール内のテキストに加えた変更は、カスタム XML 部分に保存されます。
このチュートリアルでは、次の作業について説明します。
デザイン時におけるドキュメント レベルのプロジェクトの Word 文書へのコンテンツ コントロールの追加
XML データ ファイルと、コンテンツ コントロールにバインドする要素を定義する XML スキーマを作成する。
デザイン時に XML スキーマを文書に添付する。
実行時に XML ファイルの内容を文書内のカスタム XML 部分に追加する。
コンテンツ コントロールをカスタム XML 部分の要素にバインドする。
DropDownListContentControl を XML スキーマに定義された値にバインドする。
[!メモ]
お使いのマシンで、Visual Studio ユーザー インターフェイスの一部の要素の名前や場所が、次の手順とは異なる場合があります。これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。詳細については、「Visual Studio の設定」を参照してください。
必須コンポーネント
このチュートリアルを実行するには、次のコンポーネントが必要です。
-
Microsoft Office Developer Tools が含まれているエディションの Visual Studio 2012。詳細については、「[Office ソリューションを開発できるようにコンピューターを構成する](bb398242\(v=vs.110\).md)」を参照してください。
- Word 2013 または Word 2010。
このトピックのビデオ デモについては、「Video How to: Binding Content Controls to Custom XML Parts (ビデオ デモ: カスタム XML 部分へのコンテンツ コントロールのバインド)」を参照してください。
新しい Word 文書プロジェクトを作成する
このチュートリアルで使用する Word 文書を作成します。
Word 文書プロジェクトを作成するには
EmployeeControls という名前の Word 文書プロジェクトを作成します。ソリューションの新しい文書を作成します。詳細については、「方法: Visual Studio で Office プロジェクトを作成する」を参照してください。
Visual Studio によって、デザイナーで新しい Word 文書が開き、ソリューション エクスプローラーに EmployeeControls プロジェクトが追加されます。
文書にコンテンツ コントロールを追加する
ユーザーが従業員に関する情報を表示または編集できる 3 種類のコンテンツ コントロールが含まれるテーブルを作成します。
文書にコンテンツ コントロールを追加するには
Visual Studio デザイナーでホストされている Word 文書のリボンで [挿入] タブをクリックします。
[表] グループの [表] をクリックし、2 列 3 行の表を挿入します。
最初の列に次のようにテキストを入力します。
Employee Name
Hire Date
タイトル
2 つ目の列の最初の行 (Employee Name の隣) をクリックします。
リボンの [開発] タブをクリックします。
[!メモ]
[開発] タブが表示されていない場合は、最初にこれを表示する必要があります。詳細については、「方法 : [開発] タブをリボンに表示する」を参照してください。
[コントロール] グループの [テキスト] をクリックし、最初のセルに PlainTextContentControl を追加します。
2 つ目の列の 2 つ目の行 (Hire Date の隣) をクリックします。
[コントロール] グループの [日付の選択] をクリックし、2 つ目のセルに DatePickerContentControl を追加します。
2 つ目の列の 3 つ目の行 (Title の隣) をクリックします。
[コントロール] グループの [ドロップダウン リスト] をクリックし、最後のセルに DropDownListContentControl を追加します。
これで、このプロジェクトのユーザー インターフェイスが完成しました。ここでこのプロジェクトを実行すると、最初の行にテキストを入力し、2 つ目の行で日付を選択できます。次の手順では、表示するデータを XML ファイル内の文書に添付します。
XML データ ファイルの作成
通常は、ファイルやデータベースなどの外部ソースからカスタム XML 部分に格納する XML 文字列を取得する必要があります。このチュートリアルでは、文書内のコンテンツ コントロールにバインドする要素でマークされた従業員データを含む、XML ファイルを作成します。実行時に使用可能にするため、カスタマイズ アセンブリのリソースとして XML ファイルを埋め込みます。
データ ファイルを作成するには
[プロジェクト] メニューの [新しい項目の追加] をクリックします。
[新しい項目の追加] ダイアログ ボックスが表示されます。
[テンプレート] ペインの [XML ファイル] をクリックします。
ファイルに employees.xml という名前を付け、[追加] をクリックします。
コード エディターで employees.xml ファイルが開きます。
employees.xml ファイルの内容を次のテキストに置き換えます。
<?xml version="1.0" encoding="utf-8" ?> <employees xmlns="https://schemas.microsoft.com/vsto/samples"> <employee> <name>Karina Leal</name> <hireDate>1999-04-01</hireDate> <title>Manager</title> </employee> </employees>
ソリューション エクスプローラーで employees.xml をクリックします。
[プロパティ] ウィンドウで [ビルド アクション] プロパティを選択し、値を [埋め込まれたリソース] に変更します。
この操作によって、プロジェクトをビルドしたときに、XML ファイルがリソースとしてアセンブリに埋め込まれます。これにより、実行時に XML ファイルの内容にアクセスできます。
XML スキーマを作成する
コンテンツ コントロールをカスタム XML 部分の 1 つの要素にバインドする場合は、XML スキーマを使用する必要はありません。ただし、DropDownListContentControl を複数の値にバインドする場合は、前の手順で作成した XML データ ファイルを検証する XML スキーマを作成する必要があります。XML スキーマには、title 要素に割り当てることができる値を定義します。このチュートリアルの後半で、この要素に DropDownListContentControl をバインドします。
XML スキーマを作成するには
[プロジェクト] メニューの [新しい項目の追加] をクリックします。
[新しい項目の追加] ダイアログ ボックスが表示されます。
[テンプレート] ペインの [XML スキーマ] をクリックします。
スキーマに employees.xsd という名前を付け、[追加] をクリックします。
スキーマ デザイナーが開きます。
ソリューション エクスプローラーで employees.xsd を右クリックし、[コードの表示] をクリックします。
employees.xsd ファイルの内容を次のスキーマに置き換えます。
<?xml version="1.0" encoding="utf-8" ?> <xs:schema xmlns="https://schemas.microsoft.com/vsto/samples" targetNamespace="https://schemas.microsoft.com/vsto/samples" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="employees" type="EmployeesType"></xs:element> <xs:complexType name="EmployeesType"> <xs:all> <xs:element name="employee" type="EmployeeType"/> </xs:all> </xs:complexType> <xs:complexType name="EmployeeType"> <xs:sequence> <xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="1"/> <xs:element name="hireDate" type="xs:date" minOccurs="1" maxOccurs="1"/> <xs:element name="title" type="TitleType" minOccurs="1" maxOccurs="1"/> </xs:sequence> </xs:complexType> <xs:simpleType name="TitleType"> <xs:restriction base="xs:string"> <xs:enumeration value ="Engineer"/> <xs:enumeration value ="Designer"/> <xs:enumeration value ="Manager"/> </xs:restriction> </xs:simpleType> </xs:schema>
[ファイル] メニューの [すべてを保存] をクリックして、employees.xml ファイルおよび employees.xsd ファイルに加えた変更を保存します。
XML スキーマを文書に添付する
DropDownListContentControl を title 要素の有効な値にバインドするためには、XML スキーマを文書に添付する必要があります。
XML スキーマを文書に添付するには
デザイナーで EmployeeControls.docx をアクティブにします。
リボンの [開発] タブをクリックします。
[XML] グループで、[スキーマ] をクリックします。
[テンプレートとアドイン] ダイアログ ボックスの [XML スキーマ] タブをクリックし、[スキーマの追加] をクリックします。
プロジェクト ディレクトリを開き、前の手順で作成した employees.xsd スキーマを選択して、[開く] をクリックします。
[スキーマの設定] ダイアログ ボックスの [OK] をクリックします。
[OK] をクリックして [テンプレートとアドイン] ダイアログ ボックスを閉じます。
[XML データ構造] 作業ウィンドウが表示されます。
[XML データ構造] 作業ウィンドウを閉じます。
カスタム XML 部分を文書に追加する
コンテンツ コントロールを XML ファイル内の要素にバインドするためには、XML ファイルの内容を文書内の新しいカスタム XML 部分に追加する必要があります。
カスタム XML 部分を文書に追加するには
ソリューション エクスプローラーで ThisDocument.cs または ThisDocument.vb を右クリックし、[コードの表示] をクリックします。
ThisDocument クラスに次の宣言を追加します。このコードでは、カスタム XML 部分を文書に追加するために使用する複数のオブジェクトを宣言しています。
<Cached()> _ Public employeeXMLPartID As String = String.Empty Private employeeXMLPart As Office.CustomXMLPart Private Const prefix As String = "xmlns:ns='https://schemas.microsoft.com/vsto/samples'"
[CachedAttribute()] public string employeeXMLPartID = string.Empty; private Office.CustomXMLPart employeeXMLPart; private const string prefix = "xmlns:ns='https://schemas.microsoft.com/vsto/samples'";
ThisDocument クラスに次のメソッドを追加します。このメソッドは、アセンブリにリソースとして埋め込まれている XML データ ファイルの内容を取得し、それを XML 文字列として返します。
Private Function GetXmlFromResource() As String Dim asm As System.Reflection.Assembly = _ System.Reflection.Assembly.GetExecutingAssembly() Dim stream1 As System.IO.Stream = asm.GetManifestResourceStream( _ "EmployeeControls.employees.xml") Using resourceReader As System.IO.StreamReader = _ New System.IO.StreamReader(stream1) If resourceReader IsNot Nothing Then Return resourceReader.ReadToEnd() End If End Using Return Nothing End Function
private string GetXmlFromResource() { System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly(); System.IO.Stream stream1 = asm.GetManifestResourceStream( "EmployeeControls.employees.xml"); using (System.IO.StreamReader resourceReader = new System.IO.StreamReader(stream1)) { if (resourceReader != null) { return resourceReader.ReadToEnd(); } } return null; }
ThisDocument クラスに次のメソッドを追加します。AddCustomXmlPart メソッドは、受け取った XML 文字列を含むカスタム XML 部分を作成します。
カスタム XML 部分が一度だけ作成されるように、このメソッドは、一致する GUID を持つカスタム XML 部分が文書内に存在しない場合のみカスタム XML 部分を作成します。このメソッドは、初めて呼び出されたときに、Id プロパティの値を employeeXMLPartID 文字列に格納します。employeeXMLPartID 文字列の値は、CachedAttribute 属性によって宣言されているため、文書内に保持されます。
Private Sub AddCustomXmlPart(ByVal xmlData As String) If xmlData IsNot Nothing Then employeeXMLPart = Me.CustomXMLParts.SelectByID(employeeXMLPartID) If (employeeXMLPart Is Nothing) Then employeeXMLPart = Me.CustomXMLParts.Add(xmlData) employeeXMLPart.NamespaceManager.AddNamespace("ns", _ "https://schemas.microsoft.com/vsto/samples") employeeXMLPartID = employeeXMLPart.Id End If End If End Sub
private void AddCustomXmlPart(string xmlData) { if (xmlData != null) { employeeXMLPart = this.CustomXMLParts.SelectByID(employeeXMLPartID); if (employeeXMLPart == null) { employeeXMLPart = this.CustomXMLParts.Add(xmlData); employeeXMLPart.NamespaceManager.AddNamespace("ns", @"https://schemas.microsoft.com/vsto/samples"); employeeXMLPartID = employeeXMLPart.Id; } } }
コンテンツ コントロールをカスタム XML 部分の要素にバインドする
コンテンツ コントロールをカスタム XML 部分の要素にバインドするには、各コンテンツ コントロールの XMLMapping プロパティを使用します。
コンテンツ コントロールをカスタム XML 部分の要素にバインドするには
ThisDocument クラスに次のメソッドを追加します。このメソッドは、各コンテンツ コントロールをカスタム XML 部分の要素にバインドし、DatePickerContentControl の日付表示形式を設定します。
Private Sub BindControlsToCustomXmlPart() Dim xPathName As String = "ns:employees/ns:employee/ns:name" Me.PlainTextContentControl1.XMLMapping.SetMapping(xPathName, _ prefix, employeeXMLPart) Dim xPathDate As String = "ns:employees/ns:employee/ns:hireDate" Me.DatePickerContentControl1.DateDisplayFormat = "MMMM d, yyyy" Me.DatePickerContentControl1.XMLMapping.SetMapping(xPathDate, _ prefix, employeeXMLPart) Dim xPathTitle As String = "ns:employees/ns:employee/ns:title" Me.DropDownListContentControl1.XMLMapping.SetMapping(xPathTitle, _ prefix, employeeXMLPart) End Sub
private void BindControlsToCustomXmlPart() { string xPathName = "ns:employees/ns:employee/ns:name"; this.plainTextContentControl1.XMLMapping.SetMapping(xPathName, prefix, employeeXMLPart); string xPathDate = "ns:employees/ns:employee/ns:hireDate"; this.datePickerContentControl1.DateDisplayFormat = "MMMM d, yyyy"; this.datePickerContentControl1.XMLMapping.SetMapping(xPathDate, prefix, employeeXMLPart); string xPathTitle = "ns:employees/ns:employee/ns:title"; this.dropDownListContentControl1.XMLMapping.SetMapping(xPathTitle, prefix, employeeXMLPart); }
文書が開かれたときにコードを実行する
カスタム XML 部分を作成し、文書が開かれたときにカスタム コントロールをデータにバインドします。
文書が開かれたときにコードを実行するには
ThisDocument クラスの ThisDocument_Startup メソッドに次のコード行を追加します。このコードでは、employees.xml ファイルから XML 文字列を取得し、それを文書内の新しいカスタム XML 部分に追加し、コンテンツ コントロールをカスタム XML 部分の要素にバインドします。
Dim xmlData As String = GetXmlFromResource() If xmlData IsNot Nothing Then AddCustomXmlPart(xmlData) BindControlsToCustomXmlPart() End If
string xmlData = GetXmlFromResource(); if (xmlData != null) { AddCustomXmlPart(xmlData); BindControlsToCustomXmlPart(); }
プロジェクトのテスト
文書を開くと、コンテンツ コントロールにカスタム XML 部分の要素のデータが表示されます。DropDownListContentControl をクリックすると、employees.xsd ファイルに定義された、title 要素の 3 つの有効な値のいずれかを選択できます。コンテンツ コントロールに表示されたデータを編集すると、新しい値が文書内のカスタム XML 部分に保存されます。
コンテンツ コントロールをテストするには
F5 キーを押してプロジェクトを実行します。
文書内に次のようなテーブルが表示されることを確認します。2 つ目の列の文字列は、文書内のカスタム XML 部分の要素から取得されます。
Employee Name
Karina Leal
Hire Date
April 1, 1999
タイトル
Manager
Employee Name セルの右側のセルをクリックし、別の名前を入力します。
Hire Date セルの右側のセルをクリックし、日付選択カレンダーで別の日付を選択します。
Title セルの右側のセルをクリックし、ドロップダウン リストから別の項目を選択します。
文書を保存して閉じます。
ファイル エクスプローラーで、プロジェクトの場所で\bin\Debugフォルダーを開きます。
EmployeeControls.docx を右クリックし、[名前の変更] をクリックします。
ファイル名を EmployeeControls.docx.zip に変更します。
EmployeeControls.docx 文書が Open XML Formats で保存されます。この文書の拡張子を .zip に変更すると、文書の内容を確認できます。オープン XML 形式の詳細については、技術文書「Office (2007) Open XML ファイル形式の概要」を参照してください。
EmployeeControls.docx.zip ファイルをダブルクリックします。
customXml フォルダーをダブルクリックします。
item2.xml を右クリックし、[開く] をクリックします。
このファイルには、文書に追加したカスタム XML 部分が含まれています。
name、hireDate、title の各要素に文書内のコンテンツ コントロールに入力した値が設定されていることを確認します。
item2.xml ファイルを閉じます。
次の手順
コンテンツ コントロールの使用方法の詳細については、次の各トピックを参照してください。
用意されているすべてのコンテンツ コントロールを使用してテンプレートを作成できます。詳細については、「チュートリアル : コンテンツ コントロールによるテンプレートの作成」を参照してください。
文書を閉じた状態でカスタム XML 部分のデータを変更できます。その文書を次にユーザーが開いたときには、XML 要素にバインドされたコンテンツ コントロールに新しいデータが表示されます。
コンテンツ コントロールを使用して文書の一部を保護できます。詳細については、「方法 : コンテンツ コントロールを使用して文書を保護する」を参照してください。
参照
処理手順
方法 : Word 文書にコンテンツ コントロールを追加する