Question

J'essaie de faire du traité après avoir créé un article, mais le traité est effectué deux fois parce que dans mon code après avoir créé l'article, je le mettant à jour, de sorte que la réception de l'événement se déclenche deux fois: d'abord quand j'ajoute l'élémentet le second quand je l'ai mis à jour. Voici le code:

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

Alors, comment puis-je arrêter le deuxième feu de l'articleAdded résultant de l'article.Une Gardez le premier feu depuis que je dois continuer à appliquer mon traitement?

PS: dans le cas de la mise à jour d'une liste existante.Item L'articleUPDéduit est tiré deux fois aussi !!

BTW: Ce code n'est pas écrit dans la méthode d'élément ni dans l'option MéthodeDatée, c'est le code dans un contrôle utilisateur pour un développement WebPart.

Était-ce utile?

La solution

Vous avez probablement votre récepteur d'événement enregistré deux fois.Utilisez Powershell pour savoir.

$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

Autres conseils

Désactiver l'événement de tirer avant de mettre à jour votre article.

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

Notez que cela pourrait causer des problèmes lorsque l'article.Unupdate () jette une exception, laissant votre éventuelle épargne .. Vous pouvez utiliser un try / capture pour résoudre ce problème.

J'espère que je pourrais aider :)

Puis-je savoir où était écrit ce code particulier?est-ce sur itemUpuisdatedatedaté () ou articleAjouté ().Il y a la différence entre ces deux.Dans itemAjouté () Le récepteur d'événements sera tiré uniquement lorsque le nouvel élément est ajouté dans l'optionDaqua () le récepteur d'événement Sera licencié chaque fois que l'article est mis à jour, peu importe la mesure de la mai lorsque vous mettez à jour.Aussi je vous suggère de faire les choses suivantes.

Dans l'articleAdded ou ItemUnublié, vous pouvez trouver ce code disponible par défaut.

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

Commentaire Ce code et pour la mise à jour Utilisez la méthode suivante et n'utilisez pas

item.update ();directement.

Utilisez plutôt la méthode suivante pour mettre à jour.

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

merci

Pour cela,

Vous devez définir la portée de la fonctionnalité= Web aussi bien que de définir la portée dans la fonctionnalité.Template.xml aussi.

Vous pouvez voir la solution ici. http://asharepointsolutions.blogspot.in/2014/10/SharePoint-Event-handler-firing-Twice.html

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