2009-09-03 30 views
2

私は、リスト内の特定のSPItemの更新を処理するイベントハンドラを作成しています。イベントは非同期で、問題なくSPEvenItemPropertiesを取得します。私が知りたいのは、SPItems列のどれが実際にイベントを発生させたかです。誰でもどのように考えている?Sharepointイベント処理..どの列が変更されましたか?

ありがとうございます。

答えて

3

これを実行する最善の方法は、SPItemEventPropertiesのBe​​forePropertiesとAfterPropertiesを調べて、どのフィールドの値が異なるかを確認することです。

これらは、イベントが発生する前後の項目のすべてのフィールドの値を含みます。

+0

、。バージョン管理の有無にかかわらず、通常のリストにはBeforePropertiesがまったく設定されず、すべての列が空になります。 –

+0

代わりに、2つの別々のハンドラを作成する必要があります.1つはItemUpdating(現在のプロパティ値のセットを格納)と、もう1つはItemUpdated(新しいプロパティ値セットを取得し、 Updatingハンドラによって保存されます)... –

4

あなたの答えは、SPListItemがどこでどのように取得されるかによって少し異なります。通常のリストでは、アイテムの以前の値にアクセスすることはできません。バージョニングを有効にすると、アクセス許可に応じて、以前のバージョンにアクセスすることができます。

ドキュメントライブラリでは、SPItemEventProperties.BeforePropertiesを使用してドキュメントの以前のメタデータを取得できます。あなたはこのような何かを試すことができ、ドキュメントライブラリの

:それはオンになってバージョン管理とドキュメントライブラリでない限り動作しません

実際
foreach (DictionaryEntry key in properties.BeforeProperties) 
{ 
    string beforeKey = (string)key.Key; 
    string beforeValue = key.Value.ToString(); 

    string afterValue = ""; 
    if (properties.AfterProperties[beforeKey] != null) 
    { 
     afterValue = properties.AfterProperties[beforeKey].ToString(); 
     if (afterValue != beforeValue) 
     { 
      // Changed... 
     } 
    } 
} 

.B

関連する問題