5

What is the best practice around adding event receivers across all the lists in a Site Collection?

2
  • see I have updated my response with the code. Jun 5, 2012 at 14:34
  • If I'm not mistaken, creating a list item event receiver and scoping it to 'Site' instead of 'Web' will make the Receiver fire for all lists. Sep 21, 2014 at 16:59

4 Answers 4

3

As Per said, you can attach the following code to add the Event receivers to all the lists in a Site Collection:

All you need to do it to add this code in a Feature Receiver's class file. Note: I did it only for ItemAdding event but you can add other methods as per your likings.

  public class Feature1EventReceiver : SPFeatureReceiver
    {
        // Uncomment the method below to handle the event raised after a feature has been activated.

        private SPContentType fetchContentType(SPContentTypeCollection contentTypeCollection, string ID)
        {
            SPContentType publContentType = null;
            foreach (SPContentType contentType in contentTypeCollection)
            {

                //if (contentType.Id.Equals(ID))
                if (string.Equals(contentType.Id.ToString(), ID, StringComparison.InvariantCultureIgnoreCase))
                {
                    publContentType = contentType;
                    break;
                }
            }
            return publContentType;
        }

        public override void FeatureActivated(SPFeatureReceiverProperties properties)
        {

            SPSite siteCollection = properties.Feature.Parent as SPSite;
            SPWeb myweb = siteCollection.RootWeb;
            try 
            {
                SPContentTypeCollection contentTypeCollection = siteCollection.RootWeb.ContentTypes;

                SPContentType publPageContentType = fetchContentType(contentTypeCollection, "0x01");


                publPageContentType.EventReceivers.Add(SPEventReceiverType.ItemAdding,
                       "Test.Test.Com, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ea51e61ab1378806",
                       "Test.Test.Com.EventReceivers");


                publPageContentType.Update(true, false);
                myweb.Update();

            }
            catch 
            { 

                return; 

            }

            finally{




            }



    }

You EventReceivers.cs will look like

class EventReceivers : SPItemEventReceiver
    {

        public override void ItemAdding(SPItemEventProperties properties)
        {
            if (properties.Context != null)
            {
                try
                {

                  //do something here
                }
                catch { return; }
            }

        }
}
3
6

If you want an event receiver on anything, then it's best to attach it to the content type Item (0x01)

Example: CharlieDigital: Programmatically Adding an Event Receiver to a Content Type

2
2

In my opinion i cannot recommend to add the event receiver to the system content type because it will effect all content types below the system content type. This might lead to unwanted problems an conflicts when the event receiver is fired. What is the reason for adding a event receiver to every list in?

2
  • what alternative you have at the moment?
    – Geek
    Jun 4, 2012 at 7:05
  • One alternative is to create a feature event receiver that adds the event receiver to the required lists. I'm not quite sure why you want to add a event receiver to all lists. Jun 4, 2012 at 11:49
1

Just change scope of the feature with eventreceiver from Web to Site

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.