Walkthrough: Create a Custom Site Workflow Activity

This walkthrough demonstrates how to create a custom activity for a site-level workflow using Visual Studio. (Site-level workflows apply to the whole site, not just a list on the site.) The custom activity creates a backup Announcements list and then copies the contents of the Announcements list into it.

This walkthrough demonstrates the following tasks:

  • Creating a site-level workflow.

  • Creating a custom workflow activity.

  • Creating and deleting a SharePoint list.

  • Copying items from one list to another.

  • Displaying a list on the QuickLaunch bar.

Note

Your computer might show different names or locations for some of the Visual Studio user interface elements in the following instructions. The Visual Studio edition that you have and the settings that you use determine these elements. For more information, see Visual Studio Settings.

Prerequisites

You need the following components to complete this walkthrough:

Creating a Site Workflow Custom Activity Project

First, create a project to hold and test the custom workflow activity.

To create a site workflow custom activity project

  1. On the menu bar, choose File, New, Project to display the New Project dialog box.

  2. Expand the SharePoint node under either Visual C# or Visual Basic, and then choose the 2010 node.

  3. In the Templates pane, choose the SharePoint 2010 Project template.

  4. In the Name box, enter AnnouncementBackup, and then choose the OK button.

    The SharePoint Customization Wizard appears.

  5. On the Specify the site and security level for debugging page, choose the Deploy as a farm solution option button, and then choose the Finish button to accept the trust level and default site.

    This step sets the trust level for the solution as farm solution, the only available option for workflow projects.

  6. In Solution Explorer, choose the project node, and then, on the menu bar, choose Project, Add New Item.

  7. Under either Visual C# or Visual Basic, expand the SharePoint node, and then choose the 2010 node.

  8. In the Templates pane, choose the Sequential Workflow (Farm Solution only) template, and then choose the Add button.

    The SharePoint Customization Wizard appears.

  9. On the Specify the workflow name for debugging page, accept the default name (AnnouncementBackup - Workflow1). Change the workflow template type to Site Workflow, and then choose the Next button.

  10. Choose the Finish button to accept the remaining default settings.

Adding a Custom Workflow Activity Class

Next, add a class to the project to contain the code for the custom workflow activity.

To add a custom workflow activity class

  1. On the menu bar, choose Project, Add New Item to display the Add New Item dialog box.

  2. In the Installed Templates tree view, choose the Code node, and then choose the Class template in the list of project item templates. Use the default name Class1. Choose the Add button.

  3. Replace all of the code in Class1 with the following:

    Imports System
    Imports System.Collections.Generic
    Imports System.Linq
    Imports System.Text
    Imports Microsoft.SharePoint
    
    Namespace AnnouncementBackup
        ' This custom activity will back up all of the announcements  
        ' in the Announcements list on the SharePoint site. 
        Public Class Class1
            Inherits System.Workflow.ComponentModel.Activity
            Public Sub New()
                MyBase.New()
            End Sub 
    
            ' Triggers when the activity is executed. 
            Protected Overrides Function Execute(ByVal executionContext As System.Workflow.ComponentModel.ActivityExecutionContext) As System.Workflow.ComponentModel.ActivityExecutionStatus
                Try 
                    ' Get a reference to the SharePoint site. 
                    Dim site As SPSite = New SPSite(("http://" + System.Environment.MachineName))
                    Dim web As SPWeb = site.OpenWeb("/")
                    ' Reference the original Announcements list. 
                    Dim aList As SPList = web.GetList("/Lists/Announcements")
                    ' If the Announcements Backup list already exists, delete it. 
                    Try 
                        Dim bList As SPList = web.GetList("/Lists/Announcements Backup")
                        bList.Delete()
                    Catch 
                    End Try 
                    ' Create a new backup Announcements list and reference it. 
                    Dim newAnnID As Guid = web.Lists.Add("Announcements Backup", "A backup Announcements list.", SPListTemplateType.Announcements)
                    Dim bakList As SPList = web.Lists(newAnnID)
                    ' Copy announcements from original to backup Announcements list. 
                    For Each item As SPListItem In aList.Items
                        Dim newAnnItem As SPListItem = bakList.Items.Add
                        For Each field As SPField In aList.Fields
                            If Not field.ReadOnlyField Then
                                newAnnItem(field.Id) = item(field.Id)
                            End If 
                        Next
                        newAnnItem.Update()
                    Next 
                    ' Put the Backup Announcements list on the QuickLaunch bar.
                    bakList.OnQuickLaunch = True
                    bakList.Update()
                Catch errx As Exception
                    System.Diagnostics.Debug.WriteLine(("Error: " + errx.ToString))
                End Try 
                Return MyBase.Execute(executionContext)
            End Function 
        End Class 
    End Namespace
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Microsoft.SharePoint;
    
    namespace AnnouncementBackup
    {
        // This custom activity will back up all of the announcements in  
        // the Announcements list on the SharePoint site. 
        public class Class1 : System.Workflow.ComponentModel.Activity
            {
            public Class1()
            { }
    
            // Triggers when the activity is executed. 
            protected override System.Workflow.ComponentModel.ActivityExecutionStatus Execute(System.Workflow.ComponentModel.ActivityExecutionContext executionContext)
            {
                try
                {
                    // Get a reference to the SharePoint site.
                    SPSite site = new SPSite("http://" + System.Environment.MachineName);
                    SPWeb web = site.OpenWeb("/");
    
                    // Reference the original Announcements list.
                    SPList aList = web.GetList("/Lists/Announcements");
    
                    // If the Announcements Backup list already exists, delete it. 
                    try
                    {
                        SPList bList = web.GetList("/Lists/Announcements Backup");
                        bList.Delete();
                    }
                    catch
                    { }
    
                    // Create a new backup Announcements list and reference it.
                    Guid newAnnID = web.Lists.Add("Announcements Backup", "A backup Announcements list.", SPListTemplateType.Announcements);
                    SPList bakList = web.Lists[newAnnID];
    
                    // Copy announcements from original to backup Announcements list. 
                    foreach (SPListItem item in aList.Items)
                    {
                        SPListItem newAnnItem = bakList.Items.Add();
                        foreach (SPField field in aList.Fields)
                        {
                            if (!field.ReadOnlyField)
                                newAnnItem[field.Id] = item[field.Id];
                        }
                        newAnnItem.Update();
                    }
    
                    // Put the Backup Announcements list on the QuickLaunch bar.
                    bakList.OnQuickLaunch = true;
                    bakList.Update();
    
                }
    
                catch (Exception errx)
                {
                    System.Diagnostics.Debug.WriteLine("Error: " + errx.ToString());
                }
    
                return base.Execute(executionContext);
            }
    
    
        }
    }
    
  4. Save the project, and then, on the menu bar, choose Build, Build Solution.

    Class1 appears as a custom action in the Toolbox on the AnnouncementBackup Components tab.

Adding the Custom Activity to the Site Workflow

Next, add an activity to the Workflow to contain the custom code.

To add a custom activity to the site Workflow

  1. Open Workflow1 in the workflow designer in design view.

  2. Drag Class1 from the Toolbox so that it appears under the onWorkflowActivated1 activity, or open the shortcut menu for Class1, choose Copy, open the shortcut menu for the line under the onWorkflowActivated1 activity, and then choose Paste.

  3. Save the project.

Testing the Site Workflow Custom Activity

Next, run the project and start the site workflow. The custom activity creates a backup Announcements list and copies the contents from the current Announcements list into it. The code also checks whether a backup list already exists before creating one. If a backup list already exists, it is deleted. The code also adds a link to the new list on the SharePoint site's QuickLaunch bar.

To test the site workflow custom activity

  1. Choose the F5 key to run the project and deploy it to SharePoint.

  2. On the QuickLaunch bar, choose the Lists link to display all of the lists that are available in the SharePoint site. Notice there is only one list for announcements named Announcements.

  3. At the top of the SharePoint webpage, choose the Site Workflows link.

  4. Under the Start a New Workflow section, choose the AnnouncementBackup – Workflow1 link. This starts the site workflow and runs the code in the custom action.

  5. On the QuickLaunch bar, choose the Announcements Backup link. Notice that all of the announcements that are contained in the Announcements list have been copied to this new list.

See Also

Tasks

How to: Create an Event Receiver

Other Resources

Developing SharePoint Solutions