문제

항목을 만들면 치료를 수행하려고합니다.하지만 치료는 항목을 작성한 후 내 코드 에서이 코드에서 업데이트하고 있으므로 이벤트 리미버가 두 번 해고되기 시작합니다.그리고 두 번째는 내가 그것을 갱신했을 때. 다음은 코드가 있습니다 :

if (Mode == OperationMode.New)
{
    item = ListeActions.AddItem();
    item["Client"] = new SPFieldLookupValue(myClient.ID, myClient["Name"] as string).ToString();
    //the Event Reciever ItemAdded is fired here
}
if (Mode == OperationMode.Edit)
{
    item = ListeActions.GetItemById(ActionItemID);
}
TextField ACObject = (TextField)Page.GetControlById("ACObjectID");
UserField ACAssignedTo = (UserField)Page.GetControlById("ACAssignedToID");
NoteField ACDetails = (NoteField)Page.GetControlById("ACDetailsID");

item["Object"] = ACObject.Value;
item["AssignedTo"] = ACAssignedTo.Value;
item["Details"] = ACDetails.Value;

item.Update(); 
//if we're in the case of adding new item then the event
//reciever ItemAdded is fired here for the second time
//while ItemUpdated is not fired
.

itemaddate의 두 번째 화재를 멈추게 할 수 있습니다. update ()는 내 치료를 계속 적용해야하므로 첫 번째 화재를 유지합니까?

추신 : 기존 ListActions.Item을 업데이트하는 경우 ItemUpdated도 두 번 실행됩니다 !!

btw :이 코드는 itemAdded 메서드 나 ItemUpdated 메서드에 작성되지 않으며 실제로 WebPart 개발을위한 사용자 컨트롤의 코드입니다.

도움이 되었습니까?

해결책

이벤트 수신자가 두 번 등록 할 수 있습니다.PowerShell을 사용하여 알아 내십시오.

$site = Get-SPSite http://myportal.com
$web = $site.OpenWeb("/path/to/my/site")
$list = $web.Lists["The List"]
$list.EventReceivers | Select Type, Class | Order Type, Class
.

다른 팁

항목을 업데이트하기 전에 이벤트 발사를 비활성화하십시오.

this.EventFiringEnabled = false;
item.Update();
this.EventFiringEnabled = true;
.

item.update ()가 예외를 throw하고 EventFiring을 벗어나는 경우에 문제가 발생할 수 있습니다. 이것을 해결하기 위해 시도 / 잡기를 사용할 수 있습니다.

내가 도울 수 있기를 바랍니다 :)

이 특정 코드는 어디에 서면으로 작성했는지 알 수 있습니까?ItemUpdated () 또는 itemAdded ()에 있습니다.이들은 차이가 있습니다 두.itemAdded () 이벤트 수신자가 ItemUpdated () 이벤트 수신기에 추가 될 때만 이벤트 수신자가 해고됩니다. 상품이 업데이트 될 때 상관없이 상품이 업데이트 될 때마다 해고됩니다.또한 나는 당신이 할 것을 제안합니다 다음과 같은 것들.

itemAdded 또는 ItemUpdated 에서이 코드를 기본적으로 사용할 수 있습니다.

       base.ItemUpdated(properties);
       base.ItemUpdating(properties);
       base.EventFiringEnabled = false;
.

주석이 코드와 업데이트를 위해 다음 방법을 사용하고 를 사용하지 마십시오.

item.update ();직접.

대신 다음 방법을 사용하여 업데이트합니다.

           base.EventFiringEnabled = false;
           try
           {
               contractlistitem.SystemUpdate(false);
           }
           finally
           {
               base.EventFiringEnabled = true;
           }
.

감사합니다

이를 위해

feature= web의 범위를 설정해야 할뿐만 아니라 feature.template.xml에서 범위를 설정해야합니다.

여기에서 해결책을 볼 수 있습니다. http://asharepointsolutions.blogspot.in/2014/10./ sharepoint-event-handler-firing-twice.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 sharepoint.stackexchange
scroll top