Handling SharePoint Events

Event Handling in SharePoint requires the creation of an event receiver class that inherits from a SharePoint base receiver class. In this class you over-ride the event methods you want to receive. As I like to look at it, there are 2 kinds of events: completing and completed events. Completing cover events that are in-progress: adding, updating deleting. These events capture an action before data is written to the content database. In these events you can access the SharePoint object’s current properties (properties.ListItem[“column”]) as well as the new properties that will be committed when the event is completed (properties.AfterProperties[“column”]). There is an exception though- adding events will not allow current properties to be accessed because the object does not exist within the database until this event is completed. Only the AfterProperties are available in this case.

Completed cover events that have just occurred: added, updated, deleted. When these events are fired, data has been committed to the content database. The new properties can be accessed by querying the SharePoint object’s current properties (properties.ListItem[“column”]) and the overwritten properties by accessing the object’s BeforePropreties (properties.BeforeProperties[“column”]).

Here is a simple example of using the SPItem ItemUpdated event to set a field value in the list item which has triggered the event. Notice that event firing is disabled before calling Update on the item to prevent an “infinite loop” scenario.

public class TriggerHandler : SPItemEventReceiver
{ ..

public override void ItemUpdated(SPItemEventProperties properties)
 {
            try
            {
                base.ItemUpdated(properties);
                this.DisableEventFiring();
                properties.ListItem[“column name”] = ”new value”;
                properties.ListItem.Update();
                this.EnableEventFiring();
            }
            catch (Exception ex)
            {
                logStatus(“An error occurred in processing the ItemUpdated event” + ex.Message);
            }
        }
..}

Once an event receiver class is deployed, it must be associated with the site, list or list item that will trigger the overridden events. There are many ways of doing this. Programmatically you can create a feature which references the Entity Template Id.

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <Receivers ListTemplateId="100">
    <Receiver>
      <Name>ListUpdatedEventHandler</Name>
      <Type>ItemUpdated</Type>
      <SequenceNumber>10000</SequenceNumber>
<Assembly>Projects.Events.UpdateEventHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=************
</Assembly>
<Class> Projects.Events.UpdateEventHandler. ListUpdatedEventHandler</Class>
      <Data></Data>
      <Filter></Filter>
    </Receiver>
  </Receivers>
</Elements>

Manually you can make use of pre-packaged utilities such as Event Handler Explorer: http://www.u2u.info/SharePoint/U2U%20Community%20Tools/EventHandlerExplorer.zip or the Event Handler Manager: http://www.codeplex.com/SPSCustomAdmin/Release/ProjectReleases.aspx?ReleaseId=3024