Question

La raison pour laquelle le récepteur d'événements de mise à jour d'élément se déclenche deux fois dans le cas de bibliothèques de documents est due à l'enregistrement/extraction.

Il peut également se déclencher deux fois en cas de bibliothèque/liste de documents si nous mettons à jour les valeurs d'élément actuelles avec cet événement de mise à jour d'élément.

Comment pouvons-nous gérer ces deux cas via le code ?

Était-ce utile?

La solution

Pour le scénario où c'est vous qui déclenchez la seconde ItemUpdating en modifiant les valeurs des éléments, vous pouvez utiliser le EventFiringEnabled paramètre (vous devez utiliser un try - catch -finally autour de):

this.EventFiringEnabled = false;
// Do the changes
item.Update();
this.EventFiringEnabled = true;

L'autre scénario est plus difficile, et la raison pour laquelle j'utilise ItemUpdated au lieu de cela, lorsque cela est possible !

Vous pourriez vérifier le BeforeProperties, ListItem et AfterPropertiesdans ton ItemUpdating récepteur d'événements pour vérifier si des mises à jour sont en cours sur lesquelles vous devez agir.Sinon, alors juste return.

Voici un guide pour quand tu peux utiliser .BeforePropertieset quand tu devrais y aller .ListItem plutôt

Autres conseils

public override void ItemUpdating(SPItemEventProperties properties)
{
  try
  {
    //is the item checked out?
    if (isCheckin(properties) == false)
    {
         this.EventFiringEnabled = false;

         //do your stuff

    }
  }
  catch(Exception a)
  {
    //catch any errors
  }
  finally
  {
    this.EventFiringEnabled = true; 
  }
} 

private bool isCheckin(SPItemEventProperties properties)
{
    if (properties.AfterProperties["vti_sourcecontrolcheckedoutby"] == null 
         && properties.BeforeProperties["vti_sourcecontrolcheckedoutby"] != null)
    {
        return true;
    }
    return false;
}

https://www.simple-talk.com/dotnet/.net-Tools/Maning-Imupdating-and-Itemupdated-events-firing-twice-in-a-sharepoint-Intem-vent-récepteur /

@robert sur les propriétés avant, oui, ils seraient les mêmes quelconques, peu importe ... Seule une solution possible que je puisse penser que cela aurait à la place

private bool isCheckin(SPItemEventProperties properties)
{
    string BeforeVal = properties.ListItem["vti_sourcecontrolcheckedoutby"];

    if (properties.AfterProperties["vti_sourcecontrolcheckedoutby"] == null 
         && BeforeVal != null)
    {
        return true;
    }
    return false;
}

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top