Starting/Canceling a SharePoint Designer workflow programmatically
I had enough trying to find this code, so I'm putting what I've pieced together to activate a workflow programmatically (specifically a SharePoint Designer Workflow)
public static string StartWorkflow(ContractListItem contract, string workflowName) { SPListItem wfListItem = contract.ListItem; SPWorkflowAssociationCollection wfAssocs = wfListItem.ParentList.WorkflowAssociations; SPWorkflowAssociation activeWorkflowAssoc = null; string errorMessage = string.Empty; foreach (SPWorkflowAssociation wfAssoc in wfAssocs) { if (wfAssoc.Name.Equals(workflowName)) { activeWorkflowAssoc = wfAssoc; break; } } // if the workflow exists, start the workflow SPWorkflow activeWorkflow = null; if (activeWorkflowAssoc != null) { try { activeWorkflow = SPContext.Current.Site.WorkflowManager.StartWorkflow( wfListItem, activeWorkflowAssoc, "<Data></Data>"); } catch (Exception ex) { ErrorHandler.LogError(Resources.ActionBarWebPart_WorkflowNotStarted, ex); if (activeWorkflow != null) SPWorkflowManager.CancelWorkflow(activeWorkflow); errorMessage = Resources.ActionBarWebPart_WorkflowNotStarted; } } else { ErrorHandler.LogError(Resources.ActionBarWebPart_WorkflowDoesNotExist); errorMessage = Resources.ActionBarWebPart_WorkflowDoesNotExist; } return errorMessage; } }