Skip to main content

Updating SPListItem without triggering event receivers

I had an event receiver applied on documents wich can start, programatically of course, a workflow. In this workflow, i used to update some metadatas in my document item. However that triggers the event receiver a new time and you can imagine the infinate loop. Well! afeter googling i found that it is possible to diable the event firing just before the item.Update or the item.SystemUpdate.

In first time i used this method but i didn't made my code in a try catch bloc. After doing that my workflow runs normally and it didn't fires the events in the event receiver. Here is the code :

public static class SPListItemExtensions
{
/// 
/// Provides ability to update list item without firing event receiver.
/// 
/// 
/// Disables firing 
/// event receiver while updating item.
public static void Update(this SPListItem item, bool doNotFireEvents)
{
    SPItemEventReceiverHandling rh = new SPItemEventReceiverHandling();
    if (doNotFireEvents)
    {
        try
        {
            rh.DisableEventFiring();
            item.Update();
        }
        finally
        {
            rh.EnableEventFiring();
        }
    }
    else
    {
        item.Update();
    }
}
/// 
/// Provides ability to update list item without firing event receiver.
/// 
/// 
/// 
/// Disables firing event receiver while updating 
///item.
public static void SystemUpdate(this SPListItem item,  
                                     bool incrementListItemVersion, 
                                     bool doNotFireEvents)
{
    SPItemEventReceiverHandling rh = new SPItemEventReceiverHandling();
    if (doNotFireEvents)
    {
        try
        {
            rh.DisableEventFiring();
            item.SystemUpdate(incrementListItemVersion);
        }
        finally
        {
            rh.EnableEventFiring();
        }
    }
    else
    {
        item.SystemUpdate(incrementListItemVersion);
    }
}
/// 
/// Provides ability to update list item without firing event receiver.
/// 
/// 
/// Disables firing event receiver while updating item.
public static void SystemUpdate(this SPListItem item, bool doNotFireEvents)
{
    SPItemEventReceiverHandling rh = new SPItemEventReceiverHandling();
    if (doNotFireEvents)
    {
        try
        {
            rh.DisableEventFiring();
            item.SystemUpdate();
        }
        finally
        {
            rh.EnableEventFiring();
        }
    }
    else
    {
        item.SystemUpdate();
    }
}
private class SPItemEventReceiverHandling : SPItemEventReceiver
{
    public SPItemEventReceiverHandling() { }

    new public void DisableEventFiring()
    {
        base.DisableEventFiring();
    }

    new public void EnableEventFiring()
    {
        base.EnableEventFiring();
    }


   }
}

Comments

  1. I had a headache when I was looking for a way to update my workflow task without firing the OnTaskChanged event. I found a solution but this one, let's say it, is more beautiful :).

    Thanks

    ReplyDelete

Post a Comment

Popular posts from this blog

Printing ASPX HTML Forms

Here is the way to print a part of a HTML, ASPX Form    This is the content in the page to print <script language=JavaScript> <!-- function printPartOfPage(elementId) {  var printContent = document.getElementById(elementId);  var windowUrl = 'about:blank';  var uniqueName = new Date();  var windowName = 'Print' + uniqueName.getTime();  var printWindow = window.open(windowUrl, windowName, 'left=50000,top=50000,width=0,height=0');  printWindow.document.write(printContent.innerHTML);  printWindow.document.close();  printWindow.focus();  printWindow.print();  printWindow.close(); } // --> </script> <div id="printDiv">  This is the content in the page to print </div> ////////////////////////// // To fire the event: ////////////////////////// <input type="button" value="Print" onclick="JavaScript:printPartOfPage('printDiv');" >

SharePoint Saturday France le 6 Nov. 2010

Rejoignez les architectes, les développeurs, les administrateurs, designers et autres professionnels qui travaillent avec SharePoint Server 2007 et SharePoint 2010 le 6 novembre 2010 pour un événement SharePoint exceptionnel. Les évènements SharePoint Saturday France sont des journées en libre accès, éducative, informative et animée, remplie de sessions de professionnels & MVPs reconnus pour leurs compétences et heureux de pouvoir partager leur expérience. Suivez-nous sur Twitter @clubsharepoint ou chacun des évènements sur le tag #SPSFrance. http://www.sharepointsaturday.com/france Facebook | SharePoint Saturday France