2008/05/21 21:56

EventReceiverのでItemUpdated自分自身を更新してはいけない?[SharePoint]

   public override void ItemUpdated(SPItemEventProperties properties)
        {
            base.ItemUpdated(properties);

            try
            {
                SPListItem item = properties.ListItem.ParentList.GetItemById(properties.ListItem.ID);

                if (item.GetFormattedValue("Whereabout") == "出勤"
                    || item.GetFormattedValue("Whereabout") == "退勤"
                    || item.GetFormattedValue("Whereabout") == "帰宅")
                {
                        item["Until"] = null;
                        item.Update();
                }
            }
            catch (Exception ex)
            {
            }
        }

上記のサンプルはアイテムが更新されたら更新されたアイテムの値を見て他のフィールドも更新する例ですが、
試してみるとItemUpdatedが無限に呼び出されます。(UpdateによりUpdateが呼び出されるため)
実際は10回程度しか呼び出されませんが。。バージョン管理を使っていると大変なことに。。

いろいろ試してみてitem.Update()の代わりにSystemUpdate()使えば問題なさそうですが。。。
もしSystemUpdate()もよくない解決方法なら
結局、ItemUpdatingのAfterPropertyで処理しかないんでようかね。
もしより美しい解決方法を知ってる方は教えてくください~~~~
----------------------
위의 샘플은 아이템이 업데이트될때에 현재 아이템의 다른 필드도 갱신하는 예제입니다.
하지만 실제로 실행해보면 ItemUpdated가 무한정 불려지게됩니다. (ItemUpdated가 또 ItemUpdated를 부르기때문에..)
실제로는 10번정도 불려지지만 버전관리를 사용하는 아이템이라면 엄청난 일이..-0-

여러가지 시도해보았는데 item.Update() 대신에 SystemUpdate()를 사용하면 해결되는거 같습니다.
하지만 SystemUpdate()가 제대로된 해결책이 아니라면...
해결방법으로는 ItemUpdating의 AfterProperty를 사용하는법밖에 없는듯한데 더 좋은 해결책 가지고 계신분계시면 말씀해주세요.

Trackback 0 Comment 0