チュートリアル: カスタム XML 部分へのコンテンツ コントロールのバインド
このチュートリアルでは、Word のドキュメント レベルのカスタマイズで、コンテンツ コントロールを同じ文書内の XML データにバインドする方法を説明します。
適用対象: このトピックの情報は、Word のドキュメント レベルのプロジェクトに適用されます。 詳細については、「Office アプリケーションおよびプロジェクトの種類別の使用可能な機能」を参照してください。
Word では、"カスタム XML 部分" と呼ばれる XML データを文書内に格納できます。 このデータの表示は、カスタム XML 部分の要素にコンテンツ コントロールをバインドすることによって制御できます。 このチュートリアルで例として示す文書のカスタム XML 部分には、従業員情報が格納されています。 この文書を開くと、XML 要素の値がコンテンツ コントロールに表示されます。 コンテンツ コントロール内のテキストに加えた変更は、カスタム XML 部分に保存されます。
このチュートリアルでは、次の作業について説明します。
デザイン時におけるドキュメント レベルのプロジェクトの Word 文書へのコンテンツ コントロールの追加
XML データ ファイルと、コンテンツ コントロールにバインドする要素を定義する XML スキーマを作成する。
デザイン時に XML スキーマを文書に添付する。
実行時にドキュメント内のカスタム XML パーツに XML ファイルの内容を追加する。
コンテンツ コントロールをカスタム XML 部分の要素にバインドする。
DropDownListContentControl を XML スキーマに定義された値にバインドする。
Note
次の手順で参照している Visual Studio ユーザー インターフェイス要素の一部は、お使いのコンピューターでは名前や場所が異なる場合があります。 これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。 詳細については、「Visual Studio IDE のカスタマイズ」を参照してください。
必須コンポーネント
このチュートリアルを実行するには、次のコンポーネントが必要です。
Microsoft Office Developer Tools が含まれている Visual Studio のエディション。 詳細については、「Office ソリューションを開発できるようにコンピューターを構成する」を参照してください。
Microsoft Word
Word 文書プロジェクトを作成する
このチュートリアルで使用する Word 文書を作成します。
Word 文書プロジェクトを作成するには
EmployeeControls という名前の Word 文書プロジェクトを作成します。 ソリューションの新しい文書を作成します。 詳細については、「方法: Visual Studio で Office プロジェクトを作成する」を参照してください。
Visual Studio によって、デザイナーで新しい Word 文書が開き、ソリューション エクスプローラーに EmployeeControls プロジェクトが追加されます。
文書にコンテンツ コントロールを追加する
ユーザーが従業員に関する情報を表示または編集できる 3 種類のコンテンツ コントロールが含まれるテーブルを作成します。
文書にコンテンツ コントロールを追加するには
Visual Studio デザイナーでホストされている Word 文書で、リボンの [挿入] タブを選択します。
[表] グループの [表] を選択し、2 列 3 行の表を挿入します。
最初の列に次のようにテキストを入力します。
従業員名 採用日 Title 2 つ目の列の最初の行 (Employee Name の隣) を選択します。
リボンの [開発] タブを選択します。
Note
[開発] タブが表示されていない場合は、最初にこれを表示する必要があります。 詳しくは、「方法: [開発] タブをリボンに表示する」をご覧ください。
[コントロール] グループで、[テキスト] ボタンを選択して、最初のセルに a PlainTextContentControl を追加します。
2 つ目の列の 2 つ目の行 (Hire Date の隣) を選択します。
[コントロール] グループで、[日付の選択] ボタンを選択して、2 番目のセルに a を追加DatePickerContentControlします。
2 つ目の列の 3 つ目の行 ([Title] の隣) を選択します。
[コントロール] グループで、ドロップダウン リスト ボタンを選択して、最後のセルに a DropDownListContentControl を追加します。
これで、このプロジェクトのユーザー インターフェイスが完成しました。 ここでこのプロジェクトを実行すると、最初の行にテキストを入力し、2 つ目の行で日付を選択できます。 次の手順では、表示するデータを XML ファイル内の文書に添付します。
XML データ ファイルを作成する
通常は、ファイルやデータベースなどの外部ソースからカスタム XML 部分に格納する XML 文字列を取得する必要があります。 このチュートリアルでは、文書内のコンテンツ コントロールにバインドする要素でマークされた従業員データを含む、XML ファイルを作成します。 実行時に使用可能にするため、カスタマイズ アセンブリのリソースとして XML ファイルを埋め込みます。
データ ファイルを作成するには
[プロジェクト] メニューの [新しい項目の追加] をクリックします。
[新しい項目の追加] ダイアログ ボックスが表示されます。
[テンプレート] ペインで、[XML ファイル] を選択します。
このファイルに employees.xml という名前を付け、[追加] ボタンを選択します。
コード エディターで employees.xml ファイルが開きます。
employees.xml ファイルの内容を次のテキストに置き換えます。
<?xml version="1.0" encoding="utf-8" ?> <employees xmlns="http://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="http://schemas.microsoft.com/vsto/samples" targetNamespace="http://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 スキーマをドキュメントに添付するには (Word 2013)
デザイナーで EmployeeControls.docx をアクティブにします。
リボンの [開発] タブを選択し、[アドイン] ボタンを選択します。
[テンプレートとアドイン] ダイアログ ボックスの [XML スキーマ] タブを選択し、[スキーマの追加] ボタンを選択します。
プロジェクト ディレクトリを開き、前の手順で作成した employees.xsd スキーマを選択し、[開く] ボタンを選択します。
[スキーマの設定] ダイアログ ボックスで [OK] ボタンを選択します。
[OK] ボタンを選択して [テンプレートとアドイン] ダイアログ ボックスを閉じます。
XML スキーマをドキュメントに添付するには (Word 2010)
デザイナーで EmployeeControls.docx をアクティブにします。
リボンの [開発] タブを選択します。
[XML] グループで、[スキーマ] ボタンを選択します。
[テンプレートとアドイン] ダイアログ ボックスの [XML スキーマ] タブを選択し、[スキーマの追加] ボタンを選択します。
プロジェクト ディレクトリを開き、前の手順で作成した employees.xsd スキーマを選択し、[開く] ボタンを選択します。
[スキーマの設定] ダイアログ ボックスで [OK] ボタンを選択します。
[OK] ボタンを選択して [テンプレートとアドイン] ダイアログ ボックスを閉じます。
[XML データ構造] 作業ウィンドウが開きます。
[XML データ構造] 作業ウィンドウを閉じます。
カスタム XML 部分を文書に追加する
コンテンツ コントロールを XML ファイル内の要素にバインドするためには、XML ファイルの内容を文書内の新しいカスタム XML 部分に追加する必要があります。
カスタム XML 部分を文書に追加するには
ソリューション エクスプローラーで ThisDocument.cs または ThisDocument.vb のショートカット メニューを開き、[コードの表示] を選択します。
ThisDocument
クラスに次の宣言を追加します。 このコードでは、カスタム XML 部分を文書に追加するために使用する複数のオブジェクトを宣言しています。次のメソッドを
ThisDocument
クラスに追加します。 このメソッドは、アセンブリにリソースとして埋め込まれている XML データ ファイルの内容を取得し、それを XML 文字列として返します。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 void AddCustomXmlPart(string xmlData) { if (xmlData != null) { employeeXMLPart = this.CustomXMLParts.SelectByID(employeeXMLPartID); if (employeeXMLPart == null) { employeeXMLPart = this.CustomXMLParts.Add(xmlData); employeeXMLPart.NamespaceManager.AddNamespace("ns", @"http://schemas.microsoft.com/vsto/samples"); employeeXMLPartID = employeeXMLPart.Id; } } }
コンテンツ コントロールをカスタム XML 部分の要素にバインドする
コンテンツ コントロールをカスタム XML 部分の要素にバインドするには、各コンテンツ コントロールの XMLMapping プロパティを使用します。
コンテンツ コントロールをカスタム XML 部分の要素にバインドするには
次のメソッドを
ThisDocument
クラスに追加します。 このメソッドは、各コンテンツ コントロールをカスタム XML 部分の要素にバインドし、DatePickerContentControl の日付表示形式を設定します。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 部分の要素にバインドします。
プロジェクトをテストする
文書を開くと、コンテンツ コントロールにカスタム XML 部分の要素のデータが表示されます。 DropDownListContentControl をクリックすると、employees.xsd ファイルに定義された、title
要素の 3 つの有効な値のいずれかを選択できます。 コンテンツ コントロールに表示されたデータを編集すると、新しい値が文書内のカスタム XML 部分に保存されます。
コンテンツ コントロールをテストするには
F5 キーを押してプロジェクトを実行します。
文書内に次のようなテーブルが表示されることを確認します。 2 つ目の列の文字列は、文書内のカスタム XML 部分の要素から取得されます。
Column Value 従業員名 Karina Leal 採用日 1999 年 4 月 1 日 Title マネージャー Employee Name セルの右側のセルを選択し、別の名前を入力します。
Hire Date セルの右側のセルを選択し、日付の選択で別の日付を選択します。
Title セルの右側のセルを選択し、ドロップダウン リストから別の項目を選択します。
文書を保存して閉じます。
エクスプローラーで、プロジェクトの下にある \bin\Debug フォルダーを開きます。
EmployeeControls.docx のショートカット メニューを開き、[名前の変更] を選択します。
ファイル名を EmployeeControls.docx.zip に変更します。
EmployeeControls.docx 文書は Open XML 形式で保存されています。 この文書の拡張子を .zip に変更すると、文書の内容を確認できます。 オープン XML 形式の詳細については、技術文書「Office (2007) Open XML ファイル形式の概要」を参照してください。
EmployeeControls.docx.zip ファイルを開きます。
customXml フォルダーを開きます。
item2.xml のショートカット メニューを開き、[開く] を選択します。
このファイルには、文書に追加したカスタム XML 部分が含まれています。
name
、hireDate
、title
の各要素に文書内のコンテンツ コントロールに入力した値が設定されていることを確認します。item2.xml ファイルを閉じます。
次のステップ
コンテンツ コントロールの使用方法の詳細については、次の各トピックを参照してください。
用意されているすべてのコンテンツ コントロールを使用してテンプレートを作成できます。 詳細については、「チュートリアル: コンテンツ コントロールを使用してテンプレートを作成する」を参照してください。
文書を閉じた状態でカスタム XML 部分のデータを変更できます。 その文書を次にユーザーが開いたときには、XML 要素にバインドされたコンテンツ コントロールに新しいデータが表示されます。
コンテンツ コントロールを使用して文書の一部を保護できます。 詳細については、「方法: コンテンツ コントロールを使用して文書を保護する」を参照してください。