I was researching on this matter and found a way implement. I got event handler for my submit button and I have added my code inside it.
In my test, I'll be getting site collection url from a textbox and evaluate all the webs inside that site collection. We will go inside web object and get all the lists and evaluate whether any item associated with a workflow that running status as 2, which is "In progress". Code is below
string SiteUrl = string.Empty; ArrayList inflightWorkflowDocuments = new ArrayList(); if (string.IsNullOrEmpty(txtSiteUrl.Text.ToString())) { throw new Exception("Site URL is empty!"); } else { SiteUrl = txtSiteUrl.Text.ToString(); } //Check site collection exist or not bool isSteExist = SPSite.Exists(new Uri(SiteUrl)); if (isSteExist && !string.IsNullOrEmpty(SiteUrl)) { using (SPSite site = new SPSite(SiteUrl)) { //Loop through all webs SPWebCollection allWebs = site.AllWebs; Dictionary<string, string> liUrls = new Dictionary<string, string>(); foreach (SPWeb theWeb in allWebs) { Guid webGuid = theWeb.ID; using (SPWeb web = allWebs[webGuid]) { SPListCollection cusLists = null; if (null != web.Lists) { //Get list of lists (custom/OOB lists) cusLists = web.Lists; } if (null != cusLists) { foreach (SPList sltList in cusLists) { if (sltList.Title == "TestList") { //Get each list and iterate through all items on that list foreach (SPListItem litem in sltList.Items) { //Check all workflows and their associations int wkflStatus = GetWorkflowStatus(litem); /* Workflow statuses Not Started 0 Failed on Start 1 In Progress 2 Error Occurred 3 Canceled 4 Completed 5 Failed on Start (retrying) 6 Error Occurred (retrying) 7 Canceled 15 Approved 16 Rejected 17 */ //Check that list item having Workflow 'In Progress' if (wkflStatus == 2) { //Rest of your work } } } } } } } } } //Creating a grid view with items having workflow associated. if (null != inflightWorkflowDocuments) { grdWorkflowItems.DataSource = (string[])inflightWorkflowDocuments.ToArray(typeof(string)); grdWorkflowItems.DataBind(); }
}
public int GetWorkflowStatus(SPListItem item) { if (item == null) return -1; SPWorkflowManager manager = item.Web.Site.WorkflowManager; foreach (SPWorkflow instance in manager.GetItemWorkflows(item)) { if ((instance != null) && (instance.ParentList != null) && (instance.ParentList.Fields != null)) { foreach (SPField field in instance.ParentList.Fields) { if ((field != null) && (field is SPFieldWorkflowStatus)) { SPFieldWorkflowStatus statusField = (SPFieldWorkflowStatus)field; if (item[statusField.StaticName] != null) { int statusValue = -1; try { statusValue = int.Parse(item[statusField.StaticName].ToString()); } catch { } return statusValue; } } } } } return -1; }