1

我有一个自定义 sharepoint (2007) 列表(名为 testlist),我在其上附加了一个测试工作流程(使用 sharepoint Designer 2007 构建并命名为 testwf),在“步骤 1”的“操作”部分中定义的唯一任务是等到2014 年 4 月。当我向测试列表添加新项目时,testwf 将启动,当我切换到网格视图时,该项目的字段“testwf”正在运行。

现在我需要访问与项目关联的工作流,然后通过代码通过更改其状态来“完成”此任务,但是使用以下代码,我总是将 item.Tasks 列表设为空(但我可以看到内部变量 m_allTask​​ListTasks有 1 个元素)。

        using (SPSite site = new SPSite("http://mysp"))
        {
            site.AllowUnsafeUpdates = true;
            SPWeb web = site.OpenWeb();
            web.AllowUnsafeUpdates = true;

            foreach (SPList list in web.Lists)
            {
                if (list.Title != "testlist") continue;
                foreach (SPListItem item in list.Items)
                {
                    item.Web.AllowUnsafeUpdates = true;
                    if(item.Tasks.Count > 0) 
                       //do work
                }
            }
        }

也许我错过了一些东西......

4

3 回答 3

1

交叉发布的问题。

@petauro,你在这方面取得了进展吗?我可以根据我过去成功使用的以下代码来证实@moontear 的回答:

...
// get workflow tasks for SPListItem object item
if (item != null && item.Workflows != null && item.Workflows.Count > 0)
{
    try
    {
        var workflows = site.WorkflowManager.GetItemActiveWorkflows(item);
        foreach (SPWorkflow workflow in workflows)
        {
            // match on some indentifiable attribute of your custom workflow
            // the history list title is used below as an example

            if (workflow.ParentAssociation.HistoryListTitle.Equals(Constants.WORKFLOW_HISTORY_LIST_TITLE))
            {
                var workflowTasks = workflow.Tasks;
                if (workflowTasks != null && workflowTasks.Count > 0)
                {
                    // do work on the tasks
                }
            }
        }
    }
    catch
    {
        // handle error
    }
}
...

虽然与您在最新评论中发布的代码略有不同,但看看它是否有帮助。

"testlist"另一个小问题:您的 SPWeb中是否有多个标题列表实例?如果不是,为什么要迭代web.Lists?直接获取一个列表,避免一些多余的CPU周期:SPWeb.GetList()

于 2012-12-29T20:54:59.233 回答
1

我使用此代码访问我的工作流任务:

Guid taskWorkflowInstanceID = new Guid(item["WorkflowInstanceID"].ToString());
SPWorkflow workflow = item.Workflows[taskWorkflowInstanceID];
// now you can access the workflows tasks
SPTask task = workflow.Tasks[item.UniqueId];
于 2012-11-15T09:50:28.347 回答
0

你必须对此采取不同的态度。您需要获取工作流任务列表并从那里检索您的任务并完成它。

首先,您需要检查您的项目上是否正在运行工作流:if (item.Workflows > 0)从那里您可以遍历列表项上的所有工作流实例,获取 SPWorkflowAssociation 以及关联的任务和历史列表。从那里你只需要在相关的任务列表中找到你正在寻找的任务。

于 2012-11-05T13:38:22.030 回答