チュートリアル : コンテンツ コントロールによるテンプレートの作成

このチュートリアルでは、コンテンツ コントロールを使用して Microsoft Office Word テンプレート内に構造化された再利用可能なコンテンツを作成する、ドキュメント レベルのカスタマイズを作成する方法について説明します。

対象: このトピックの情報は、Word 2013 と Word 2010 のドキュメント レベルのプロジェクトに適用されます。詳細については、「Office アプリケーションおよびプロジェクト タイプ別の使用可能な機能」を参照してください。

Word では、ビルド ブロックと呼ばれる再利用可能なドキュメント パーツのコレクションを作成できます。このチュートリアルでは、2 つの表をビルド ブロックとして作成する方法を示します。それぞれの表には、プレーンテキストや日付など、さまざまな種類のコンテンツを格納できる複数のコンテンツ コントロールを追加します。一方の表には従業員の情報を表示し、もう一方の表には顧客フィードバックを表示します。

テンプレートから文書を作成した後で、テンプレート内のビルド ブロックを表示する複数の BuildingBlockGalleryContentControl オブジェクトを使用して、いずれかの表を文書に追加できます。

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

  • デザイン時に Word テンプレート内のコンテンツ コントロールを含む表を作成する。

  • プログラムによってコンボ ボックス コンテンツ コントロールとドロップダウン リスト コンテンツ コントロールにデータを読み込む。

  • ユーザーが特定の表を編集できないようにする。

  • テンプレートのビルド ブロック コレクションに表を追加する。

  • テンプレート内のビルド ブロックを表示するコンテンツ コントロールを作成する。

[!メモ]

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

必須コンポーネント

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

-

Microsoft Office Developer Tools が含まれているエディションの Visual Studio 2012。詳細については、「[Office ソリューションを開発できるようにコンピューターを構成する](bb398242\(v=vs.110\).md)」を参照してください。
  • Word 2013 または Word 2010。

新しい Word テンプレート プロジェクトを作成する

Word テンプレートを作成し、ユーザーが独自のコピーを簡単に作成できるようにします。

新しい Word テンプレート プロジェクトを作成するには

  • MyBuildingBlockTemplate という名前で Word テンプレート プロジェクトを作成します。ウィザードで、ソリューションの新しいドキュメントを作成します。詳細については、「方法: Visual Studio で Office プロジェクトを作成する」を参照してください。

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

従業員表の作成

ユーザーが従業員に関する情報を入力できる 4 種類のコンテンツ コントロールが含まれる表を作成します。

従業員表を作成するには

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

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

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

    Employee Name

    Hire Date

    タイトル

    画像

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

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

    [!メモ]

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

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

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

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

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

  10. [コントロール] グループの [コンボ ボックス]ComboBoxContentControl をクリックし、3 つ目のセルに ComboBoxContentControl を追加します。

  11. 2 つ目の列の最後のセル (Picture の隣) をクリックします。

  12. [コントロール] グループの [画像コンテンツ コントロール]PictureContentControl をクリックし、最後のセルに PictureContentControl を追加します。

顧客フィードバック表の作成

ユーザーが顧客フィードバックを入力できる 3 種類のコンテンツ コントロールが含まれる表を作成します。

顧客フィードバック表を作成するには

  1. Word テンプレートで、先ほど追加した従業員表の後の行をクリックし、Enter キーを押します。新しい段落が追加されます。

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

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

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

    Customer Name

    Satisfaction Rating

    コメント

  5. 2 つ目の列の最初のセル (Customer Name の隣) をクリックします。

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

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

  8. 2 つ目の列の 2 つ目のセル (Satisfaction Rating の隣) をクリックします。

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

  10. 2 つ目の列の最後のセル (Comments の隣) をクリックします。

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

プログラムによってコンボ ボックスとドロップダウン リストにデータを読み込む

Visual Studio の [プロパティ] ウィンドウを使用して、デザイン時にコンテンツ コントロールを初期化することができます。実行時にコンテンツ コントロールを初期化し、コントロールの初期状態を動的に設定することもできます。このチュートリアルでは、実行時に ComboBoxContentControlDropDownListContentControl にエントリを追加するコードを使用して、これらのオブジェクトがどのように動作するかを示します。

コンテンツ コントロールの UI をプログラムで変更するには

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

  2. ThisDocument クラスに次のコードを追加します。このコードでは、後で使用する複数のオブジェクトを宣言しています。

    Private GroupControl1 As Microsoft.Office.Tools.Word.GroupContentControl
    Private BuildingBlockControl1 As Microsoft.Office.Tools.Word.BuildingBlockGalleryContentControl
    Private BuildingBlockControl2 As Microsoft.Office.Tools.Word.BuildingBlockGalleryContentControl
    
    private Microsoft.Office.Tools.Word.GroupContentControl groupControl1;
    private Microsoft.Office.Tools.Word.BuildingBlockGalleryContentControl buildingBlockControl1;
    private Microsoft.Office.Tools.Word.BuildingBlockGalleryContentControl buildingBlockControl2;
    
  3. ThisDocument クラスの ThisDocument_Startup メソッドに次のコード行を追加します。このコードは、表の ComboBoxContentControlDropDownListContentControl にエントリを追加し、ユーザーによる編集の前にそれぞれのコントロールに表示するプレースホルダー テキストを設定します。

    ComboBoxContentControl1.PlaceholderText = "Choose a title, or enter your own"
    ComboBoxContentControl1.DropDownListEntries.Add("Engineer", "Engineer", 0)
    ComboBoxContentControl1.DropDownListEntries.Add("Designer", "Designer", 1)
    ComboBoxContentControl1.DropDownListEntries.Add("Manager", "Manager", 2)
    
    DropDownListContentControl1.PlaceholderText = _
        "Choose a rating (1 lowest, 3 highest)"
    DropDownListContentControl1.DropDownListEntries.Add("1", "1", 0)
    DropDownListContentControl1.DropDownListEntries.Add("2", "2", 1)
    DropDownListContentControl1.DropDownListEntries.Add("3", "3", 2)
    
    comboBoxContentControl1.PlaceholderText = "Choose a title, or enter your own";
    comboBoxContentControl1.DropDownListEntries.Add("Engineer", "Engineer", 0);
    comboBoxContentControl1.DropDownListEntries.Add("Designer", "Designer", 1);
    comboBoxContentControl1.DropDownListEntries.Add("Manager", "Manager", 2);
    
    dropDownListContentControl1.PlaceholderText =
        "Choose a rating (1 lowest, 3 highest)";
    dropDownListContentControl1.DropDownListEntries.Add("1", "1", 0);
    dropDownListContentControl1.DropDownListEntries.Add("2", "2", 1);
    dropDownListContentControl1.DropDownListEntries.Add("3", "3", 2);
    

ユーザーが従業員表を編集できないようにする

従業員表を保護するには、前の手順で宣言した GroupContentControl オブジェクトを使用します。表を保護しても、ユーザーは表内のコンテンツ コントロールを編集できます。ただし、最初の列のテキストを編集することはできず、表に行と列の追加や削除などの変更を加えることもできません。GroupContentControl を使用して文書の一部を保護する方法の詳細については、「コンテンツ コントロール」を参照してください。

ユーザーが従業員表を編集できないようにするには

  • 前の手順で追加したコードの後に位置する ThisDocument クラスの ThisDocument_Startup メソッドに次のコードを追加します。このコードは、前の手順で宣言した GroupContentControl オブジェクトに従業員表を追加することにより、ユーザーがこの表を編集できないようにします。

    Me.Tables(1).Select()
    GroupControl1 = Me.Controls.AddGroupContentControl("groupControl1")
    
    this.Tables[1].Range.Select();
    groupControl1 = this.Controls.AddGroupContentControl("groupControl1");
    

ビルド ブロック コレクションに表を追加する

テンプレート内の文書のビルド ブロックのコレクションに表を追加することにより、ここで作成した表をユーザーが文書に挿入できるようになります。文書のビルド ブロックの詳細については、「コンテンツ コントロール」を参照してください。

テンプレートのビルド ブロックに表を追加するには

  1. 前の手順で追加したコードの後に位置する ThisDocument クラスの ThisDocument_Startup メソッドに次のコードを追加します。このコードは、2 つの表を含む新しいビルド ブロックを Microsoft.Office.Interop.Word.BuildingBlockEntries コレクションに追加します。このコレクションにはテンプレート内の再利用可能なすべてのビルド ブロックが含まれています。新しいビルド ブロックは、Employee and Customer Information と呼ばれる新しいカテゴリに定義され、ビルド ブロック型 Microsoft.Office.Interop.Word.WdBuildingBlockTypes.wdTypeCustom1 が割り当てられます。

    Dim template1 As Word.Template = TryCast(Me.AttachedTemplate, Word.Template)
    If template1 IsNot Nothing Then
    
        template1.BuildingBlockEntries.Add("Employee Table", _
            Word.WdBuildingBlockTypes.wdTypeCustom1, "Employee and Customer Information", _
            Me.Tables(1).Range, InsertOptions:=Word.WdDocPartInsertOptions.wdInsertContent)
        template1.BuildingBlockEntries.Add("Customer Table", _
            Word.WdBuildingBlockTypes.wdTypeCustom1, "Employee and Customer Information", _
            Me.Tables(2).Range, InsertOptions:=Word.WdDocPartInsertOptions.wdInsertContent)
    End If
    
    Word.Template template1 = this.AttachedTemplate as Word.Template;
    
    if (template1 != null)
    {
        object description = null;
        template1.BuildingBlockEntries.Add("Employee Table",
            Word.WdBuildingBlockTypes.wdTypeCustom1, "Employee and Customer Information",
            this.Tables[1].Range, ref description, Word.WdDocPartInsertOptions.wdInsertContent);
        template1.BuildingBlockEntries.Add("Customer Table",
            Word.WdBuildingBlockTypes.wdTypeCustom1, "Employee and Customer Information",
            this.Tables[2].Range, ref description, Word.WdDocPartInsertOptions.wdInsertContent);
    }
    
  2. 前の手順で追加したコードの後に位置する ThisDocument クラスの ThisDocument_Startup メソッドに次のコードを追加します。このコードはテンプレートから表を削除します。この段階で表は不要になります。表はテンプレート内の再利用可能なビルド ブロックのギャラリに追加されているからです。このコードは、まず文書をデザイン モードに切り替え、保護されている従業員表を削除できるようにします。

    If Me.FormsDesign = False Then
        Me.ToggleFormsDesign()
    End If
    Me.Tables(2).Delete()
    Me.Tables(1).Delete()
    Me.ToggleFormsDesign()
    
    if (!this.FormsDesign)
    {
        this.ToggleFormsDesign();
    }
    this.Tables[2].Delete();
    this.Tables[1].Delete();
    this.ToggleFormsDesign();
    

ビルド ブロックを表示するコンテンツ コントロールを作成する

前の手順で作成したビルド ブロック (表) へのアクセスを提供するコンテンツ コントロールを作成します。ユーザーは、このコントロールをクリックすることにより、表を文書に追加できます。

ビルド ブロックを表示するコンテンツ コントロールを作成するには

  • 前の手順で追加したコードの後に位置する ThisDocument クラスの ThisDocument_Startup メソッドに次のコードを追加します。このコードは、前の手順で宣言した BuildingBlockGalleryContentControl オブジェクトを初期化します。BuildingBlockGalleryContentControl は、Employee and Customer Information カテゴリに定義された、Microsoft.Office.Interop.Word.WdBuildingBlockTypes.wdTypeCustom1 型のすべてのビルド ブロックを表示します。

    BuildingBlockControl1 = Me.Controls.AddBuildingBlockGalleryContentControl( _
        Me.Paragraphs(1).Range, "buildingBlockControl1")
    BuildingBlockControl1.BuildingBlockCategory = "Employee and Customer Information"
    BuildingBlockControl1.BuildingBlockType = Word.WdBuildingBlockTypes.wdTypeCustom1
    BuildingBlockControl1.PlaceholderText = "Choose your first building block"
    
    BuildingBlockControl2 = Me.Controls.AddBuildingBlockGalleryContentControl( _
        Me.Paragraphs(2).Range, "buildingBlockControl2")
    BuildingBlockControl2.BuildingBlockCategory = "Employee and Customer Information"
    BuildingBlockControl2.BuildingBlockType = Word.WdBuildingBlockTypes.wdTypeCustom1
    BuildingBlockControl2.PlaceholderText = "Choose your second building block"
    
    buildingBlockControl1 = this.Controls.AddBuildingBlockGalleryContentControl(
        this.Paragraphs[1].Range, "buildingBlockControl1");
    buildingBlockControl1.BuildingBlockCategory = "Employee and Customer Information";
    buildingBlockControl1.BuildingBlockType = Word.WdBuildingBlockTypes.wdTypeCustom1;
    buildingBlockControl1.PlaceholderText = "Choose your first building block";
    
    buildingBlockControl2 = this.Controls.AddBuildingBlockGalleryContentControl(
        this.Paragraphs[2].Range, "buildingBlockControl2");
    buildingBlockControl2.BuildingBlockCategory = "Employee and Customer Information";
    buildingBlockControl2.BuildingBlockType = Word.WdBuildingBlockTypes.wdTypeCustom1;
    buildingBlockControl2.PlaceholderText = "Choose your second building block";
    

プロジェクトのテスト

ユーザーは、文書内のビルド ブロック ギャラリ コントロールをクリックして、従業員表または顧客フィードバック表を挿入します。ユーザーは両方の表のコンテンツ コントロールで応答を入力または選択できます。顧客フィードバック表については他の部分も変更できますが、従業員表ではユーザーが他の部分を変更できないことが必要です。

従業員表をテストするには

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

  2. [Choose your first building block] をクリックして、ビルド ブロック ギャラリ内のコンテンツ コントロールを表示します。

  3. コントロールの [Custom Gallery 1] という見出しの隣にあるドロップダウン矢印をクリックし、[Employee Table] をクリックします。

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

    このセルにテキストのみ追加できることを確認します。PlainTextContentControl は、ユーザーに対してテキストの追加だけを可能にし、アートや表など、他の種類のコンテンツを追加できないようにします。

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

  6. Title セルの右側のセルをクリックし、コンボ ボックスで役職を選択します。

    一覧に適切な役職がない場合は、役職名を入力してください。役職名を入力できるのは、ComboBoxContentControl がユーザーに対して一覧からエントリを選択することと独自のエントリを入力することを可能にしているからです。

  7. Picture セルの右側のセルに表示されたアイコンをクリックし、表示するイメージを選択します。

  8. 表に行を追加してみてください。また、表から列と行を削除してみてください。表を変更できないことを確認します。GroupContentControl によって、表に対する変更が阻止されます。

顧客フィードバック表をテストするには

  1. [Choose your second building block] をクリックして、ビルド ブロック ギャラリ内の 2 つ目のコンテンツ コントロールを表示します。

  2. コントロールの [Custom Gallery 1] という見出しの隣にあるドロップダウン矢印をクリックし、[Customer Table] をクリックします。

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

  4. Satisfaction Rating セルの右側のセルをクリックし、いずれかのオプションを選択します。

    独自のエントリを入力できないことを確認します。DropDownListContentControl は、ユーザーに対してエントリを一覧から選択することのみ可能にします。

  5. Comments セルの右側のセルをクリックし、コメントを入力します。

    任意で、アートや埋め込み先編集用の表などのテキスト以外のコンテンツを追加します。これが可能なのは、RichTextContentControl がユーザーに対してテキスト以外のコンテンツの追加を可能にしているからです。

  6. 表に行や列を追加でき、表から行や列を削除することもできることを確認します。このような変更が可能なのは、表を GroupContentControl への追加によって保護していないからです。

  7. テンプレートを閉じます。

次の手順

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

参照

処理手順

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

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

概念

拡張オブジェクトによる Word の自動化

コンテンツ コントロール

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

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

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