2012-03-26 21 views
0

機能のアップグレードリストビューにコンテンツタイプの新しい列を指すフィールドを追加する必要があります。FeatureUpgrading内のリストビューにフィールドを追加する - リストビューを識別する方法

現在のところ、私のコードは、ビューのタイトルがであるという前提に基づいています。すべてのリンク(私はデバッガでそれを入手しました)。だから、スニペットです:

   SPView view; 
       try 
       { 
        view = list.Views["All Links"]; 
       } 
       catch 
       { 
        view = list.Views[0]; // just in case 
       } 
       view.ViewFields.Add("NewField"); 
       view.Update(); 

は、今では動作しますが、前提は、ビューのタイトルが であるということであるすべてのリンク(または1つのビューのみがあります[0])。私はschema.xmlの中や他の場所ではタイトルを見つけられませんでした。コード内のビューを更新する最も安全な方法は何ですか? (あるいは、例えばXMLを使って更新するより良い方法があるかもしれませんが、私が知っている限り、機能がアップグレードされたときにschema.xmlファイルは考慮されません)。

おかげで、パヴェル

答えて

1

適切なView elementのDisplayName属性を見て、のschema.xml内のビューのデフォルトのタイトルを検索します。属性値が「すべてのリンク」の場合は、正常である可能性があります。

デフォルトでは、リンクリスト定義の場合のように、値は$Resources:core,All_Links;のようになります。考慮する必要があります。あなたのサイトが英語のみの場合は、「すべてのリンク」を検索しても問題ありません。 (属性値が「すべてのリンク」であるか、すべてのサイトが英語である場合、まだ可能性があっても、今

string title = SPUtility.GetLocalizedString(
    "$Resources:All_Links;", 
    "core", 
    web.Language); 
SPView view = list.Views[title]; 

:あなたが他の言語のサイトを持っている場合しかし、あなたはこのような何かをする必要があります。特にUpgradingイベントでは、タイトルがデフォルトから変更されています)。そのような場合は、BaseViewIDで検索することをおすすめします。残念ながら、そこにBaseViewIDのインデクサではありませんので、私は次のコードを使用します。あなたのビューを取得するための

private SPView GetView(SPList list, string id) 
{ 
    SPView view = null; 
    foreach (SPView v in list.Views) 
    { 
     if (id == v.BaseViewID) 
     { 
      view = v; 
      break; 
     } 
    } 
    return view; 
} 
0

もう一つの方法は、SPWeb.GetViewFromUrl("Lists/{List_Name}/{View_Name}.aspx")を使用して参照されたいですmsdn article

(あなたの機能はWebである場合 - スコープ)次に、あなたのコードは次のようになります:

SPWeb web = (SPWeb)properties.Feature.Parent;  
SPView view = web.GetViewFromUrl("Lists/<List_Name>/All Links.aspx"); 
view.ViewFields.Add("NewField"); 
view.Update(); 
関連する問題