please pay attention to the Task List. The Task lists execute the Workflow really. If you don't finalize the assigned task, your WF not run. This is my code to exceute a task and make te WF continue by the steps:
This code it's used ina SP WebPart, with a WorkFlow with two approvers.:
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite site = new SPSite(url))
{
using (SPWeb web = site.OpenWeb())
{
web.AllowUnsafeUpdates = true;
try
{
SPList task = web.Lists["Tasks"];
SPListItem item = task.Items.GetItemById(Convert.ToInt32(Request.Params["ID"]));
if (item["WorkflowListId"] != null)
{
Guid sourceListID = new Guid(item["WorkflowListId"].ToString());
SPList sourceList = web.Lists.GetList(sourceListID, true);
int sourceListItemID = Convert.ToInt32(item["WorkflowItemId"]);
SPListItem sourceListItem = sourceList.GetItemById(sourceListItemID);
if (sourceListItem["Aprobador"].ToString() == "Aprobador 1" && Convert.ToString(sourceListItem["State"]) == "En Revisión")
{
sourceListItem["State"] = "Approved 1";
sourceListItem["Approver"] = "Approver 1";
sourceListItem.Update();
//Get the workflow instance id from Task item
Guid taskWorkflowInstanceID = new Guid(item["WorkflowInstanceID"].ToString());
SPWorkflow workflow = item.Workflows[taskWorkflowInstanceID];
SPWorkflowTask wfTask = workflow.Tasks[item.UniqueId];
Hashtable ht = new Hashtable();
ht[SPBuiltInFieldId.Completed] = "TRUE";
ht["Completed"] = "TRUE";
ht[SPBuiltInFieldId.PercentComplete] = 1.0f;
ht["PercentComplete"] = 1.0f;
ht["Status"] = "Completed";
ht[SPBuiltInFieldId.TaskStatus] = SPResource.GetString(new CultureInfo((int)wfTask.Web.Language, false), Strings.WorkflowStatusInProgress, new object[0]);
ht[SPBuiltInFieldId.WorkflowOutcome] = "Approved";
ht["TaskStatus"] = "Approved";
ht["FormData"] = SPWorkflowStatus.InProgress;
SPWorkflowTask.AlterTask((wfTask as SPListItem), ht, true);
Response.Redirect(Request.Params["Source"]);
}
else
{
if (sourceListItem["Approver"].ToString() == "Aprobador 1" && Convert.ToString(sourceListItem["State"]) == "Approved 1")
{
sourceListItem["State"] = "Approved 2";
sourceListItem["Aprobador"] = "Approver 2";
sourceListItem.Update();
//Get the workflow instance id from Task item
Guid taskWorkflowInstanceID = new Guid(item["WorkflowInstanceID"].ToString());
SPWorkflow workflow = item.Workflows[taskWorkflowInstanceID];
SPWorkflowTask wfTask = workflow.Tasks[item.UniqueId];
Hashtable ht = new Hashtable();
ht[SPBuiltInFieldId.Completed] = "TRUE";
ht["Completed"] = "TRUE";
ht[SPBuiltInFieldId.PercentComplete] = 1.0f;
ht["PercentComplete"] = 1.0f;
ht["Status"] = "Completed";
ht[SPBuiltInFieldId.TaskStatus] = SPResource.GetString(new CultureInfo((int)wfTask.Web.Language, false), Strings.WorkflowStatusInProgress, new object[0]);
ht[SPBuiltInFieldId.WorkflowOutcome] = "Approved";
ht["TaskStatus"] = "Approved";
ht["FormData"] = SPWorkflowStatus.InProgress;
SPWorkflowTask.AlterTask((wfTask as SPListItem), ht, true);
Response.Redirect(Request.Params["Source"]);
}
}
}
}
catch (Exception ex)
{
}
finally
{
web.AllowUnsafeUpdates = false;
}
}
}
});
The list with attached WF have a two fields: Approver and State. But the code that run the Task and make advance the WF it's:
SPList task = web.Lists["Tasks"];
SPListItem item = task.Items.GetItemById(Convert.ToInt32(Request.Params["ID"]));
Guid taskWorkflowInstanceID = new Guid(item["WorkflowInstanceID"].ToString());
SPWorkflow workflow = item.Workflows[taskWorkflowInstanceID];
SPWorkflowTask wfTask = workflow.Tasks[item.UniqueId];
Hashtable ht = new Hashtable();
ht[SPBuiltInFieldId.Completed] = "TRUE";
ht["Completed"] = "TRUE";
ht[SPBuiltInFieldId.PercentComplete] = 1.0f;
ht["PercentComplete"] = 1.0f;
ht["Status"] = "Completed";
ht[SPBuiltInFieldId.TaskStatus] = SPResource.GetString(new CultureInfo((int)wfTask.Web.Language, false), Strings.WorkflowStatusInProgress, new object[0]);
ht[SPBuiltInFieldId.WorkflowOutcome] = "Approved";
ht["TaskStatus"] = "Approved";
ht["FormData"] = SPWorkflowStatus.InProgress;
SPWorkflowTask.AlterTask((wfTask as SPListItem), ht, true);