In this post, guest author Lucas Eduardo Silva will walk you through the steps of instantiating a workflow using an item event receiver from a custom list. The ItemDeleting event will require approval via the workflow. Foreword As you may have read recently, I injured my right hand and have had it in a cast for the past 3 weeks. Due to this I planned to reduce my blogging while my hand heals. As luck would have it, I was actually approached by someone who asked if they could be a guest author on my blog. I’ve never had a guest author, but considering my injury now seemed like as good a time as ever to try it out. About the Guest Author Lucas Eduardo Silva (email) works for CPM Braxis, a sibling company to my employer Sogeti in the CapGemini family. Lucas and I exchanged emails a few times after one of my recent posts and continued into various topics. When I posted that I had injured my hand, Lucas mentioned that he had a post idea that he would like to publish and asked if it could be published on my blog. The below content is the result of that collaboration. The Problem Lucas has a big problem. He has a workflow that he wants to fire every time an item is
deleted from a custom list. He has already created the association in the "item deleting event", but needs to approve the deletion but the workflow is finishing first. Lucas put an onWorkflowItemChanged wait for the change of status approval, but it is not being hit. The Solution Note: This solution assumes you have the Visual Studio Extensions for Windows SharePoint Services (VSeWSS) installed to access the SharePoint project templates within VIsual Studio. 1 - Create a workflow that will be activated by ItemEventReceiver. 2 - Create the list by Visual Studio clicking in File -> New -> Project. Select SharePoint, then List Definition. 3 - Select the type of document to be created. List, Document Library, Wiki, Tasks, etc.. 4 - Visual Studio creates the file ItemEventReceiver.cs with all possible events in a list. 5 – In the workflow project, open the workflow.xml and copy the ID. 6 - Uncomment the ItemDeleting and insert the following code by replacing the ID that you copied earlier. //Cancel the Exclusion
properties.Cancel = true;
//Activating Exclusion Workflow
SPWorkflowManager workflowManager = properties.ListItem.Web.Site.WorkflowManager;
SPWorkflowAssociation wfAssociation =
properties.ListItem.ParentList.WorkflowAssociations.
GetAssociationByBaseID(new Guid("37b5aea8-792a-4ded-be25-d283d9fe1f9d"));
workflowManager.StartWorkflow(properties.ListItem, wfAssociation, wfAssociation.AssociationData, true);
properties.Status = SPEventReceiverStatus.CancelNoError;
7 - properties.Cancel cancels the event being activated and executes the code that is inside the event. In the example, it cancels the deletion of the item to start the workflow that will be active as an association list with the workflow ID.
8 - Create and deploy the workflow and the list for SharePoint.
9 - Create a list through the model that was created.
10 - Enable the workflow in the list and Congratulations!
Every time you try to delete the item the workflow is activated.
TIP: If you really want to delete the item after the workflow is done you will have to delete the item by the workflow.
this.workflowProperties.Site.AllowUnsafeUpdates = true;
this.workflowProperties.Item.Delete();
this.workflowProperties.List.Update();
Conclusion
In this guest post Lucas took you through the steps of creating an item deletion approval workflow with an event receiver. This was also the first time I’ve had a guest author on this blog. Many thanks to Lucas for putting together this content and offering it. I haven’t decided how I’d handle future guest authors, mostly because I don’t know if there are others who would want to submit content. If you do have something that you would like to guest author on my blog feel free to drop me a line and we can discuss. As a disclaimer, there are no guarantees that it will be published though. For now enjoy Lucas’ post and look for my return to regular blogging soon.
-Frog Out
<Update 1> If you wish to contact Lucas you can reach him at
[email protected] </Update 1>