2010-12-29 7 views

答えて

3

それはこのように行うことができます。

public void ListContentTypes(string siteUrl) 
{ 
    try 
    { 
    using (SPSite site = new SPSite(siteUrl)) 
    { 
     using (SPWeb web = site.OpenWeb()) 
     { 
     ListContentTypes(web); 
     } 
    } 
    } 
    catch (Exception ex) 
    { 
    // add some proper error handling here 
    } 
} 

public void ListContentTypes(SPWeb web) 
{ 
    foreach (SPContentType ct in web.ContentTypes) 
    { 
    // do whatever you want to do with the content type here 
    } 

    foreach (SPWeb subWeb in web.Webs) 
    { 
    try 
    { 
     ListContentTypes(subWeb); 
    } 
    finally 
    { 
     if (subWeb != null) 
     { 
     subWeb.Dispose(); 
     } 
    } 
    } 
} 

これは、サイトコレクション内に存在するすべてのコンテンツタイプを見つけることではなく、すべてのコンテンツタイプはサイトコレクション全体で利用できるようになりますことを覚えているでしょう。例えば、サブサイトに存在するコンテンツタイプ 'Product'がある場合、上記のコードはそれを見つけますが、それは下位レベルで定義されているため、ルートWebで使用することはできません。

2

は、この方法を試してください。urWeb.AvailableContentTypes

+0

インストールされている、または選択されていない、使用されている/使用されていないすべてのインストール済みのContentTypesが含まれていますか? –

+1

はい...試してみてください – Grace

+0

このプロパティの問題は、下位レベルで定義されているコンテンツタイプが得られないことです。したがって、サイトコレクションからすべてのコンテンツタイプが返されるわけではありません。特定のWebとそのすべての親Webで定義されたコンテンツタイプを提供します。 –

4

は、この1つはサイト内のすべてのSPWeb年代にすべてのタイプのためにそれを行います。重複が生成されることに注意してください。

public void GetContentTypes() 
    { 
     string siteUrl = "Add site url here"; 

     using (SPSite site = new SPSite(siteUrl)) 
     { 
       foreach (SPWeb web in site.AllWebs) 
       { 
        foreach (SPContentType item in web.ContentTypes) 
        { 
         Debug.WriteLine(item.Name); 
        } 
        foreach (SPList list in web.Lists) 
        { 
         foreach (SPContentType item in list.ContentTypes) 
         { 
          Debug.WriteLine(item.Name); 
         } 
        } 
        web.Dispose(); 
       } 
     } 
    } 
+0

私はルートウェブだけでなく、すべてのウェブを見なければなりません! –

+0

@Anna Karin、私はすべてのウェブを更新しました –

+0

site.AllWebsで取得した各SPWebを廃棄する必要があります –

関連する問題