リストにコンテンツ タイプを追加する

最終更新日: 2011年5月27日

適用対象: SharePoint Foundation 2010

SharePoint Online で使用可能

リスト定義の XML に含まれるコンテンツ タイプを参照できるので、そのタイプのリストがユーザーによって作成されるたびに、Microsoft SharePoint Foundation 2010 がコンテンツ タイプを既定でリストに挿入するように指定できます。また、SharePoint Foundation オブジェクト モデルを使用するコードを記述して、コンテンツ タイプを既存のリストに追加することもできます。

リスト定義でコンテンツ タイプを指定する

コンテンツ タイプをリスト定義に追加する前に、リストがコンテンツ タイプをサポートするように構成されていることを確認する必要があります。最初に確認するのは、リスト インスタンスを作成するときに使用されたテンプレートです。ListTemplate 要素に DisallowContentTypes という名前の属性があり、その属性が TRUE に設定されている場合、リストではコンテンツ タイプがサポートされません。属性が FALSE に設定されているか存在しない場合は、コンテンツ タイプがサポートされます。

次に、コンテンツ タイプがリスト インスタンスで有効になっているかどうかを確認します。リスト インスタンスを定義する Schema.xml ファイルには、List 要素があり、この要素には、EnableContentTypes という名前の属性が含まれている必要があります。この属性は、TRUE に設定されていなければなりません。この属性を TRUE に設定することは、[リストの設定] の [詳細設定] セクションにある [コンテンツ タイプの管理を許可する] で [はい] を選択することと同じです。

リスト定義にコンテンツ タイプを追加するには、ContentTypes 要素をリスト スキーマに追加します。ContentTypes 要素には、ContentTypeRef 要素のコレクションが格納されます。各 ContentTypeRef 要素は、指定されたタイプの新規リストをユーザーが作成するごとに、SharePoint Foundation がリスト コンテンツ タイプとしてリストにローカル コピーするサイト コンテンツ タイプを指定します。ContentTypeRef 要素には、ID という単一の属性が格納されます。この属性を、コンテンツ タイプ ID に設定します。

参照するサイト コンテンツ タイプは、リストの範囲内に存在する必要があります。つまり、サイト階層内において同じかそれより上のサイト レベルで宣言する必要があります。コンテンツ タイプの範囲の詳細については、「コンテンツ タイプの範囲」を参照してください。

注意

SharePoint Foundation は、リスト インスタンスを作成するとき、リストの基本タイプ スキーマ内またはリスト スキーマ内で宣言されている列だけを挿入します。リスト スキーマ内のサイト コンテンツ タイプを参照する場合で、リストの基本タイプ スキーマ内またはリスト スキーマ内に含まれていないサイト内の列を、コンテンツ タイプが参照している場合、これらの列は挿入されません。SharePoint Foundation によってこれらの列がリストに挿入されるようにするには、これらの列をリスト スキーマで宣言する必要があります。

サイト内の列の詳細については、「列について」を参照してください。

コンテンツ タイプをリスト定義に追加するには

  1. リスト定義 XML 内で、ContentTypeRef 要素を ContentTypes 要素に追加します。

  2. ContentTypeRef 要素の ID 属性を、リストに含めたいコンテンツ タイプのコンテンツ タイプ ID に設定します。

以下の例は、ContentTypeRef 要素が含まれるリスト定義スキーマのマークアップの一部を示しています。

<List xmlns:ows="Microsoft SharePoint" Title="The List" Direction="$Resources:Direction;" FolderCreation="FALSE" Url="Lists/TheList" BaseType="0" xmlns="https://schemas.microsoft.com/sharepoint/">
  <MetaData>
    <ContentTypes>
      <ContentTypeRef ID="0x01060062efcfca3f4d4036a0c54ed20108fa2e" />
    </ContentTypes>
    ...
  </MetaData>
</List>

リスト定義スキーマの ContentTypes 要素の詳細については、「ContentTypes 要素 (リスト)」を参照してください。

コンテンツ タイプを既存のリストに追加する

SharePoint Foundation オブジェクト モデルを利用して、コンテンツ タイプを既存のリストに追加できます。

コンテンツ タイプをリストに追加するには

  1. Lists プロパティを使用して、リストが配置されているサイトのリストのコレクションを取得します。

  2. SPList 型の変数を宣言し、この変数を、リストを表すサイト リスト コレクションのオブジェクトと同じ値に設定にします。

  3. リストの ContentTypesEnabled プロパティの値を true に設定し、リストのコンテンツ タイプを有効にします。

  4. AvailableContentTypes プロパティを使用して、リストが配置されているサイトで利用可能なコンテンツ タイプにアクセスします。このメソッドは SPContentTypeCollection オブジェクトを返します。

  5. SPContentType 型の変数を宣言し、この変数を、リストに追加するサイト コンテンツ タイプを表すコレクション内の SPContentType オブジェクトと同じ値に設定します。

  6. IsContentTypeAllowed(SPContentType) メソッドを呼び出して、選択したコンテンツ タイプをリストが受け入れることを確認します。

  7. ContentTypes プロパティを使用して、指定したリスト上の、リスト コンテンツ タイプのコレクションにアクセスします。このメソッドは SPContentTypeCollection オブジェクトを返します。

  8. Add メソッドを使用して、リスト コンテンツ タイプ コレクションに SPContentType オブジェクトを追加します。

オブジェクト モデルを使用するリストにサイト コンテンツ タイプを追加する場合、そのコンテンツ タイプが格納する列で、リストにまだ存在しない列が SharePoint Foundation によって自動的に追加されます。これは、リスト スキーマでコンテンツ タイプを参照する場合と対照的です。コンテンツ タイプを参照する場合は、リスト スキーマに明示的に列を追加して、SharePoint Foundation によって列がリスト インスタンスに挿入されるようにする必要があります。

以下の例は、サイト コンテンツ タイプを、サイトの [共有ドキュメント] リストに追加するコンソール アプリケーションです。この例で使用されるコンテンツ タイプは、「[方法] サイトにコンテンツ タイプを追加する」の例で作成されたコンテンツ タイプと同じです。

コンソール アプリケーションは、開発環境で実験を行う場合に便利です。運用環境では、この例のコードは、多くの場合、SPFeatureReceiver オブジェクトの FeatureActivated メソッドの一部として含まれています。

using System;
using Microsoft.SharePoint;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SPSite siteCollection = new SPSite("https://localhost"))
            {
                using (SPWeb site = siteCollection.OpenWeb())
                {

                    // Get a content type.
                    SPContentType ct = site.AvailableContentTypes["Financial Document"];

                    // The content type was found.
                    if (ct != null) 
                    {

                        // Get a list.
                        try 
                        {
                            SPList list = site.Lists["Shared Documents"]; // Throws exception if does not exist.

                            // Make sure the list accepts content types.
                            list.ContentTypesEnabled = true;

                            // Add the content type to the list.
                            if (!list.IsContentTypeAllowed(ct))
                                Console.WriteLine("The {0} content type is not allowed on the {1} list",
                                                   ct.Name, list.Title);
                            else if (list.ContentTypes[ct.Name] != null)
                                Console.WriteLine("The content type name {0} is already in use on the {1} list",
                                                   ct.Name, list.Title);
                            else
                                list.ContentTypes.Add(ct);
                        }
                        catch (ArgumentException ex) // No list is found.
                        {
                            Console.WriteLine("The list does not exist.");
                        }
                    }
                    else // No content type is found.
                    {
                        Console.WriteLine("The content type is not available in this site.");
                    }
                }
            }
            Console.Write("\nPress ENTER to continue...");
            Console.ReadLine();
        }
    }
}
Imports System
Imports Microsoft.SharePoint

Module Test
   Sub Main()
      Using siteCollection As SPSite = New SPSite("https://localhost")
         Using site As SPWeb = siteCollection.OpenWeb()

            ' Get a content type.
            Dim ct As SPContentType = site.AvailableContentTypes("Financial Document")

            If ct IsNot Nothing Then

                ' The content type was found.
                Try

                    ' Get a list.
                    Dim list As SPList = site.Lists("Shared Documents")

                    ' Make sure the list accepts content types.
                    list.ContentTypesEnabled = True

                    ' Add the content type to the list.
                    If Not list.IsContentTypeAllowed(ct) Then
                        Console.WriteLine("The {0} content type is not allowed on the {1} list", ct.Name, list.Title)
                    ElseIf list.ContentTypes(ct.Name) IsNot Nothing Then
                        Console.WriteLine("The content type name {0} is already in use on the {1} list", ct.Name, list.Title)
                    Else
                        list.ContentTypes.Add(ct)
                    End If
                Catch ex As ArgumentException

                    ' No list is found.
                    Console.WriteLine("The list does not exist.")
                End Try
            Else

                ' No content type is found.
                Console.WriteLine("The content type is not available in this site.")
            End If
         End Using
      End Using
      Console.Write(vbCrLf + "Press ENTER to continue...")
      Console.ReadLine()
   End Sub
End Module

関連項目

概念

サイトとリストのコンテンツ タイプ

コンテンツ タイプの範囲

コンテンツ タイプ定義