I had some time so I decided to add the counterparts to the gl-addeventreceiver command that I just published. I created two new commands, gl-deleteeventreceiver and gl-enumeventreceivers. This post will cover the delete command and I’ll go over the enum command in my next post.

From a code perspective the delete command is very similar to the add command. The main difference (aside from the obvious call to Delete instead of Add) is that I’ve made the assembly, class, and type parameters optional (though at least one must be provided) so the code to get the event receiver to delete needed to be expanded so that it now evaluates each receiver and checks to see if a valid match is found. Once all the receivers have been identified then we simply delete them all.

 1/// <summary>
 2/// Deletes an event receiver from the specified target
 3/// </summary>
 4/// <param name="url">The URL.</param>
 5/// <param name="contentTypeName">Name of the content type.</param>
 6/// <param name="target">The target.</param>
 7/// <param name="assembly">The assembly.</param>
 8/// <param name="className">Name of the class.</param>
 9/// <param name="type">The type.</param>
10/// <param name="typeNotProvided">if set to <c>true</c> [type not provided].</param>
11public static void Delete(string url, string contentTypeName, TargetEnum target, string assembly, string className, SPEventReceiverType type, bool typeNotProvided)
12{
13    using (SPSite site = new SPSite(url))
14    using (SPWeb web = site.OpenWeb())
15    {
16        SPEventReceiverDefinitionCollection eventReceivers;
17        if (target == TargetEnum.List)
18        {
19            SPList list = Utilities.GetListFromViewUrl(web, url);
20 
21            if (list == null)
22            {
23                throw new Exception("List not found.");
24            }
25            eventReceivers = list.EventReceivers;
26        }
27        else if (target == TargetEnum.Site)
28            eventReceivers = web.EventReceivers;
29        else
30        {
31            SPContentType contentType = null;
32            try
33            {
34                contentType = web.AvailableContentTypes[contentTypeName];
35            }
36            catch (ArgumentException)
37            {
38            }
39            if (contentType == null)
40                throw new SPSyntaxException("The specified content type could not be found.");
41 
42            eventReceivers = contentType.EventReceivers;
43        }
44        Delete(eventReceivers, type, assembly, className, typeNotProvided);
45    }
46}
47 
48/// <summary>
49/// Deletes the event receiver matching the provided values from the passed in collection.
50/// </summary>
51/// <param name="eventReceivers">The event receivers.</param>
52/// <param name="eventReceiverType">Type of the event receiver.</param>
53/// <param name="assembly">The assembly.</param>
54/// <param name="className">Name of the class.</param>
55/// <param name="typeNotProvided">if set to <c>true</c> [type not provided].</param>
56private static void Delete(SPEventReceiverDefinitionCollection eventReceivers, SPEventReceiverType eventReceiverType, string assembly, string className, bool typeNotProvided)
57{
58    List<SPEventReceiverDefinition> toDelete = new List<SPEventReceiverDefinition>();
59    foreach (SPEventReceiverDefinition erd in eventReceivers)
60    {
61        if ((erd.Assembly == assembly || assembly == null) && 
62            (erd.Class == className || className == null) && 
63            ((erd.Type == eventReceiverType && !typeNotProvided) || typeNotProvided))
64        {
65            toDelete.Add(erd);
66        }
67    }
68    foreach (SPEventReceiverDefinition erd in toDelete)
69    {
70        Log("Deleting the {0} event for class {1} in assembly {2}.", erd.Type.ToString(), erd.Class,
71            erd.Assembly);
72 
73        erd.Delete();
74    }
75}

The help for the command is shown below:

C:\>stsadm -help gl-deleteeventreceiver

stsadm -o gl-deleteeventreceiver


Deletes an event receiver from a list, web, or content type.

Parameters:
        -url <web or list URL>
        -target <site | list | contenttype>
        [-assembly <assembly>]
        [-class <class name>]
        [-type <itemadding | itemupdating | itemdeleting | itemcheckingin | itemcheckingout | itemuncheckingout | itemattachmentadding | itemattachmentdeleting | itemfilemoving | fieldadding | fieldupdating | fielddeleting | sitedeleting | webdeleting | webmoving | itemadded | itemupdated | itemdeleted | itemcheckedin | itemcheckedout | itemuncheckedout | itemattachmentadded | itemattachmentdeleted | itemfilemoved | itemfileconverted | fieldadded | fieldupdated | fielddeleted | sitedeleted | webdeleted | webmoved | emailreceived | contextevent | invalidreceiver>]
        [-contenttype <content type name if target is ContentType>]

The following table summarizes the command and its various parameters:

Command NameAvailabilityBuild Date
gl-deleteeventreceiverWSS v3, MOSS 2007Released: 9/13/2008
Parameter NameShort FormRequiredDescriptionExample Usage
urlYesThe URL to the web or list to remove the event receiver from.-url http://portal/pages
assemblyaNoThe fully qualified assembly name containing the event receiver class to delete from the target.-assembly "Lapointe.WebPartPageHistory, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3216c23aba16db08", -a "Lapointe.WebPartPageHistory, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3216c23aba16db08"
classcNoThe fully qualified class name of the event receiver to delete from the target.-class Lapointe.WebPartPageHistory.ListEventReceivers.SourceListEventReceiver, -c Lapointe.WebPartPageHistory.ListEventReceivers.SourceListEventReceiver
typeNoThe event type to delete.-type itemupdated
targetNoThe target type of which the receiver will be deleted. Must be either “list”, “site”, or “contenttype”. If omitted defaults to “list”.-target list
contenttypectNo, unless target is contenttypeThe name of the content type to remove the event receiver from if the target is contenttype.-contenttype "Page", -ct "Page"

The following is an example of how to delete all the event receivers belonging to the web part page history assembly:

stsadm -o gl-deleteeventreceiver -url http://portal/pages -assembly "Lapointe.WebPartPageHistory, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3216c23aba16db08" -target list

Note that you should be particularly careful when deleting event receivers and not specifying the assembly and class attributes as you could inadvertently delete event receivers that are critical to the normal functioning of the list.