チュートリアル : カスタム XML 部分へのコンテンツ コントロールのバインド

更新 : 2007 年 11 月

対象

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

プロジェクトの種類

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

Microsoft Office のバージョン

  • Word 2007

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

このチュートリアルでは、Word 2007 のドキュメント レベルのカスタマイズで、コンテンツ コントロールを同じ文書内の XML データにバインドする方法を説明します。

Word 2007 では、カスタム XML 部分と呼ばれる XML データを文書内に格納できます。このデータの表示は、カスタム XML 部分の要素にコンテンツ コントロールをバインドすることによって制御できます。このチュートリアルで例として示す文書のカスタム XML 部分には、従業員情報が格納されています。この文書を開くと、XML 要素の値がコンテンツ コントロールに表示されます。コンテンツ コントロール内のテキストに加えた変更は、カスタム XML 部分に保存されます。

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

  • デザイン時におけるドキュメント レベルのプロジェクトの Word 文書へのコンテンツ コントロールの追加

  • XML データ ファイルと、コンテンツ コントロールにバインドする要素を定義する XML スキーマを作成する。

  • デザイン時に XML スキーマを文書に添付する。

  • 実行時に XML ファイルの内容を文書内のカスタム XML 部分に追加する。

  • コンテンツ コントロールをカスタム XML 部分の要素にバインドする。

  • DropDownListContentControl を XML スキーマに定義された値にバインドする。

Bb398244.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 2007

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

新しい Word 文書プロジェクトを作成する

このチュートリアルで使用する Word 2007 文書を作成します。

Word 2007 文書プロジェクトを作成するには

  • 2007 Microsoft Office システムの Word 文書プロジェクト テンプレートを使用して、EmployeeControls という名前の Word 文書プロジェクトを作成します。ソリューションの新しい文書を作成します。詳細については、「方法 : Visual Studio Tools for Office プロジェクトを作成する」を参照してください。

    Visual Studio によって、デザイナで新しい Word 文書が開き、ソリューション エクスプローラに EmployeeControls プロジェクトが追加されます。

文書にコンテンツ コントロールを追加する

ユーザーが従業員に関する情報を表示または編集できる 3 種類のコンテンツ コントロールが含まれるテーブルを作成します。

文書にコンテンツ コントロールを追加するには

  1. Visual Studio デザイナでホストされている Word 文書のリボンで [挿入] タブをクリックします。

  2. [表] グループの [表] をクリックし、2 列 3 行のテーブルを挿入します。

  3. 最初の列に次のようにテキストを入力します。

    Employee Name

    Hire Date

    Title

  4. 2 つ目の列の最初の行 (Employee Name の隣) をクリックします。

  5. リボンの [開発] タブをクリックします。

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

    [開発] タブが表示されていない場合は、最初にこれを表示する必要があります。詳細については、「方法 : [開発] タブをリボンに表示する」を参照してください。

  6. [コントロール] グループの [テキスト]PlainTextContentControl をクリックし、最初のセルに PlainTextContentControl を追加します。

  7. 2 つ目の列の 2 つ目の行 (Hire Date の隣) をクリックします。

  8. [コントロール] グループの [日付の選択]DatePickerContentControl をクリックし、2 つ目のセルに DatePickerContentControl を追加します。

  9. 2 つ目の列の 3 つ目の行 (Title の隣) をクリックします。

  10. [コントロール] グループの [ドロップダウン リスト]DropDownListContentControl をクリックし、最後のセルに DropDownListContentControl を追加します。

これで、このプロジェクトのユーザー インターフェイスが完成しました。ここでこのプロジェクトを実行すると、最初の行にテキストを入力し、2 つ目の行で日付を選択できます。次の手順では、表示するデータを XML ファイル内の文書に添付します。

XML データ ファイルの作成

通常は、ファイルやデータベースなどの外部ソースからカスタム XML 部分に格納する XML 文字列を取得する必要があります。このチュートリアルでは、文書内のコンテンツ コントロールにバインドする要素でマークされた従業員データを含む、XML ファイルを作成します。実行時に使用可能にするため、カスタマイズ アセンブリのリソースとして XML ファイルを埋め込みます。

データ ファイルを作成するには

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

    [新しい項目の追加] ダイアログ ボックスが表示されます。

  2. [テンプレート] ペインの [XML ファイル] をクリックします。

  3. ファイルに employees.xml という名前を付け、[追加] をクリックします。

    コード エディタで employees.xml ファイルが開きます。

  4. 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>
    
  5. ソリューション エクスプローラで employees.xml をクリックします。

  6. [プロパティ] ウィンドウで [ビルド アクション] プロパティを選択し、値を [埋め込まれたリソース] に変更します。

    この操作によって、プロジェクトをビルドしたときに、XML ファイルがリソースとしてアセンブリに埋め込まれます。これにより、実行時に XML ファイルの内容にアクセスできます。

XML スキーマを作成する

コンテンツ コントロールをカスタム XML 部分の 1 つの要素にバインドする場合は、XML スキーマを使用する必要はありません。ただし、DropDownListContentControl を複数の値にバインドする場合は、前の手順で作成した XML データ ファイルを検証する XML スキーマを作成する必要があります。XML スキーマには、title 要素に割り当てることができる値を定義します。このチュートリアルの後半で、この要素に DropDownListContentControl をバインドします。

XML スキーマを作成するには

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

    [新しい項目の追加] ダイアログ ボックスが表示されます。

  2. [テンプレート] ペインの [XML スキーマ] をクリックします。

  3. スキーマに employees.xsd という名前を付け、[追加] をクリックします。

    スキーマ デザイナが開きます。

  4. ソリューション エクスプローラで employees.xsd を右クリックし、[コードの表示] をクリックします。

  5. 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>
    
  6. [ファイル] メニューの [すべてを保存] をクリックして、employees.xml ファイルおよび employees.xsd ファイルに加えた変更を保存します。

XML スキーマを文書に添付する

DropDownListContentControl を title 要素の有効な値にバインドするためには、XML スキーマを文書に添付する必要があります。

XML スキーマを文書に添付するには

  1. デザイナで EmployeeControls.docx をアクティブにします。

  2. リボンの [開発] タブをクリックします。

  3. [XML] グループで、[スキーマ] をクリックします。

  4. [テンプレートとアドイン] ダイアログ ボックスの [XML スキーマ] タブをクリックし、[スキーマの追加] をクリックします。

  5. プロジェクト ディレクトリを開き、前の手順で作成した employees.xsd スキーマを選択して、[開く] をクリックします。

  6. [スキーマの設定] ダイアログ ボックスの [OK] をクリックします。

  7. [OK] をクリックして [テンプレートとアドイン] ダイアログ ボックスを閉じます。

    [XML データ構造] 作業ウィンドウが表示されます。

  8. [XML データ構造] 作業ウィンドウを閉じます。

カスタム XML 部分を文書に追加する

コンテンツ コントロールを XML ファイル内の要素にバインドするためには、XML ファイルの内容を文書内の新しいカスタム XML 部分に追加する必要があります。

カスタム XML 部分を文書に追加するには

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

  2. 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'";
    
  3. 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;
    }
    
  4. ThisDocument クラスに次のメソッドを追加します。AddCustomXmlPart メソッドは、受け取った XML 文字列を含むカスタム XML 部分を作成します。

    カスタム XML 部分が一度だけ作成されるように、このメソッドは、一致する GUID を持つカスタム XML 部分が文書内に存在しない場合のみカスタム XML 部分を作成します。このメソッドは、初めて呼び出されたときに、Microsoft.Office.Interop.Word.CustomXMLPart.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, missing);
                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 部分に保存されます。

コンテンツ コントロールをテストするには

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

  2. 文書内に次のようなテーブルが表示されることを確認します。2 つ目の列の文字列は、文書内のカスタム XML 部分の要素から取得されます。

    Employee Name

    Karina Leal

    Hire Date

    April 1, 1999

    Title

    管理者

  3. Employee Name セルの右側のセルをクリックし、別の名前を入力します。

  4. Hire Date セルの右側のセルをクリックし、日付選択カレンダーで別の日付を選択します。

  5. Title セルの右側のセルをクリックし、ドロップダウン リストから別の項目を選択します。

  6. 文書を保存して閉じます。

  7. Windows エクスプローラで、プロジェクトの下にある \bin\Debug フォルダを開きます。

  8. EmployeeControls.docx を右クリックし、[名前の変更] をクリックします。

  9. ファイル名を EmployeeControls.docx.zip に変更します。

    EmployeeControls.docx 文書がオープン XML 形式で保存されます。この文書の拡張子を .zip に変更すると、文書の内容を確認できます。オープン XML 形式の詳細については、技術文書「Office (2007) Open XML ファイル形式の概要」を参照してください。

  10. EmployeeControls.docx.zip ファイルをダブルクリックします。

  11. customXml フォルダをダブルクリックします。

  12. item2.xml を右クリックし、[開く] をクリックします。

    このファイルには、文書に追加したカスタム XML 部分が含まれています。

  13. name、hireDate、title の各要素に文書内のコンテンツ コントロールに入力した値が設定されていることを確認します。

  14. item2.xml ファイルを閉じます。

次の手順

コンテンツ コントロールの使用方法の詳細については、次の各トピックを参照してください。

参照

処理手順

方法 : Word 文書にコンテンツ コントロールを追加する

方法 : コンテンツ コントロールを使用して文書を保護する

概念

コンテンツ コントロール

ホスト項目とホスト コントロールの概要

ホスト項目およびホスト コントロールのプログラム上の制限事項

実行時の Office ドキュメントへのコントロールの追加

ホスト コントロールのヘルパー メソッド

その他の技術情報

Word ホスト コントロール