For a very long time, I have been thinking to write this particular function. Here, there are two methods we can use. Either the Elements.xml or with the CS. I always believe in C Sharp, rather than the Elements File. Hence, I have come up with a Generic Method which will delete the event receiver and attach the event receiver to the List.
The Code snippet is self-explanatory and does not require much explanation.
private static void AttachEventReceiver(SPWeb web,string listName,string eventClassName,string eventName,int sequenceNumber,string eventReceiverType) { SPList list = web.Lists[listName]; if (list != null) { SPEventReceiverDefinition eventReceiverDefinitionToDelete = null; foreach (SPEventReceiverDefinition eventReceiverDefinition in list.EventReceivers) { if (eventReceiverDefinition.Class == eventClassName) { eventReceiverDefinitionToDelete = eventReceiverDefinition; break; } } if (eventReceiverDefinitionToDelete != null) { eventReceiverDefinitionToDelete.Delete(); list.Update(); } SPEventReceiverDefinition workflowStatusUpdatedEventDefinition = list.EventReceivers.Add(); workflowStatusUpdatedEventDefinition.Assembly = System.Reflection.Assembly.GetExecutingAssembly().FullName; workflowStatusUpdatedEventDefinition.Class = eventClassName; workflowStatusUpdatedEventDefinition.SequenceNumber = sequenceNumber; workflowStatusUpdatedEventDefinition.Name = eventName; switch (eventReceiverType) { case "ItemUpdated": workflowStatusUpdatedEventDefinition.Type = SPEventReceiverType.ItemUpdated ; break; case "CheckIn": workflowStatusUpdatedEventDefinition.Type = SPEventReceiverType.ItemCheckedIn; break; case "ItemDeleting": workflowStatusUpdatedEventDefinition.Type = SPEventReceiverType.ItemDeleting; break; default: break; } workflowStatusUpdatedEventDefinition.HostId = list.ID; workflowStatusUpdatedEventDefinition.HostType = SPEventHostType.List; workflowStatusUpdatedEventDefinition.Update(); list.Update(); } } private static void DeleteEventReceiver(SPWeb web,string listName, string eventClassName) { SPList pagesList = web.Lists[listName]; if (pagesList != null) { SPEventReceiverDefinition eventReceiverDefinitionToDelete = null; foreach (SPEventReceiverDefinition er in pagesList.EventReceivers) { if (er.Class == eventClassName) { eventReceiverDefinitionToDelete = er; break; } } if (eventReceiverDefinitionToDelete != null) { eventReceiverDefinitionToDelete.Delete(); pagesList.Update(); } } }
And the Sample Call to these methods are as follows.
public override void FeatureActivated(SPFeatureReceiverProperties properties) { SPSite site = (SPSite)properties.Feature.Parent; SPWeb web = site.RootWeb; SPWeb confidentialWeb = site.AllWebs[SiteVariables.SITE_CONFIDENTIAL]; AttachEventReceiver(web, "Pages", "EventReceiver Assembly Name", "Event Name", 1000, "CheckIn"); } public override void FeatureDeactivating(SPFeatureReceiverProperties properties) { SPSite site = (SPSite)properties.Feature.Parent; SPWeb web = site.RootWeb; SPWeb confidentialWeb = site.AllWebs[SiteVariables.SITE_CONFIDENTIAL]; DeleteEventReceiver(web,"Pages"," EventReceiver Assembly Name "); }
Hope this snippet is useful.
Happy Coding,
Sathish Nadarajan.
Leave a comment