如何使用sharepoint对象模型获取项目的批准工作流程的状态?

时间:2010-10-19 04:43:16

标签: visual-studio-2010 sharepoint-2010

有一个列表,批准工作流程与之关联,工作流程在添加项目时启动。列表具有匿名访问权限,因此任何人都可以输入项目,但项目需要得到批准者的批准。项目将具有状态(例如批准,拒绝等)。

现在,我正在创建一个可视webpart。我想在网格中显示列表项。但是我只需要显示那些被批准的项目。我正在使用sharepoint对象模型,如何根据项目过滤项目批准状态。

由于

4 个答案:

答案 0 :(得分:2)

“工作流程状态”字段的名称通常是工作流程名称的前8个字母数字字符。 Approved的值为16.因此,仅选择已批准的项目应如下所示:

string caml = @"<Where><Eq><FieldRef Name='MyApprov' /><Value Type='WorkflowStatus'>16</Value></Eq></Where>";
SPQuery query = new SPQuery();
query.Query = caml;
SPListItemCollection items = list.GetItems(query);

答案 1 :(得分:2)

private static void ListWorkflowStatus()
{
    string siteUrl = ConfigurationManager.AppSettings["SiteUrl"];

    // Get the site in impersonated context
    using (SPSite site = new SPSite(siteUrl))
    using (SPWeb web = site.OpenWeb())
    {
        SPList lib = web.Lists[ConfigurationManager.AppSettings["LibraryName"]];

        foreach (SPListItem item in lib.Items)
        {
            string titleColumn = ConfigurationManager.AppSettings["TitleColumn"];
            string workflowColumn = ConfigurationManager.AppSettings["WorkflowColumn"];

            string workflowStatus = item[workflowColumn] as string;
            Console.WriteLine(string.Format("{0}\t{1} ({2})", item[titleColumn], GetStatusName(workflowStatus), workflowStatus));
        }
    }
}

private static string GetStatusName(string value)
{
    if (string.IsNullOrEmpty(value))
    {
        return "N/A";
    }

    switch (value)
    {
        case "0":
            return "Not Started";
        case "1":
            return "Failed On Start";
        case "2":
            return "In Progress";
        case "3":
            return "Error Occurred";
        case "4":
            return "Canceled";
        case "5":
            return "Completed";
        case "6":
            return "Failed On Start (retrying)";
        case "7":
            return "Error Occurred (retrying)";
        case "15":
            return "Canceled";
        case "16":
            return "Approved";
        case "17":
            return "Rejected";
        default:
            return "N/A";
    }
}

唯一的问题是如何获取工作流列名称;为此,我建议您使用SharePoint Manager 2010工具,浏览到与工作流关联的库,并从那里获取列名称(最多8个字符,对我来说是“AOFWF0”)

答案 2 :(得分:1)

您可以使用此示例代码获取状态

示例代码:

//Obtain a list item
SPListItem currItem = currList.Items[0];
//Get the workflow status value
int wFlowStatusnum= (int)currItem ["WorkFlowName"];
//this will give you the one you see in the List view
string wFlowStatus= System.Enum.GetName(typeof(SPWorkflowStatus), wFlowStatusnum);

答案 3 :(得分:0)

我来到页面搜索答案,但发现所有答案都使用静态字段名称或其他一些非常有限的approch。

所以最后做我自己的研究,这就是我如何形成工作流程字段名称

string WFColumnName = string.Empty;
foreach (SPWorkflowAssociation assoc_wf in ReqList.WorkflowAssociations)
        {
            if (assoc_wf.BaseTemplate.Id.ToString() == "63e32cd3-2002-4b2f-81b0-4a2b4c3ccafa")
            {
                string str_workflowName = assoc_wf.Name;
                Regex rgx = new Regex("[^a-zA-Z0-9]");
                str_workflowName = rgx.Replace(str_workflowName, "");
                if (str_workflowName.Trim().Length >= 8)
                    WFColumnName = str_workflowName.Substring(0, 8);
                else
                    WFColumnName = str_workflowName.Substring(0, str_workflowName.Length);

                break;
            }
            }  

列名是基于此形成的(名称具有误导性,但它只是列的名称): How to get the SharePoint workflow status for each SP item with a PowerShell script?

然后我在我的CAML查询中使用它

if(WFColumnName != string.Empty)
            viewFields += "<FieldRef Name='" + WFColumnName + "' />";

在我的情况下,我只需要检查它是否完成所以我得到字符串值并与“5”进行比较。