1

我有一個自定義SharePoint(2007)名單(名爲testlist)上接上一個測試流程(建有SharePoint Designer 2007中,並命名爲testwf),其中只有任務的「操作」部分定義的「第1步」是要等到2014年4月 當我添加一個新的項目到testlist的testwf將開始,當我切換到網格視圖,該項目有場「testwf」跑步。SPListItem.Tasks總是空

現在我需要訪問與該項目相關聯的工作流程,然後通過更改其狀態通過代碼「完成」此任務,但使用以下代碼,我總是獲得item.Tasks list empty(但我可以看到內部變量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 
       } 
      } 
     } 

也許我失去了一些東西......

回答

0

你必須去不同的看法這一點。您需要獲取工作流任務列表並從那裏檢索您的任務並完成它。

首先,您需要檢查工作流是否在您的項目上運行:if (item.Workflows > 0)從那裏您可以遍歷列表項目上的所有工作流實例,獲取SPWorkflowAssociation以及關聯的任務和歷史列表。從那裏你只需要在關聯的任務列表中找到你正在尋找的任務。

+0

感謝您的回答,我嘗試通過在我的下一個答案代碼中實現您的建議,但仍然沒有運氣... – petauro

0

感謝moontear,下面你的建議我只是試圖修改我的代碼,這

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; 
       foreach (SPWorkflow workflow in item.Workflows) 
       { 
        var t = site.WorkflowManager.GetWorkflowTasks(item, workflow.InstanceId); 
        if(item.Tasks.Count > 0) // always empty 
        if(t.Count > 0) // always empty 
        if(workflow.Tasks.Count > 0) // always empty 
       } 
      } 
     } 
    } 

但仍沒有運氣,任務列表爲空,又...

1

我用這個代碼來訪問我的workflowtasks :

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]; 
1

Cross-posted問題。

@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 
    } 
} 
... 

雖然只在您的最新評論發佈的代碼稍有不同,看看是否有幫助。

另一個小點:是你的標題內的SPWeb名單"testlist"的有多個實例?如果沒有,爲什麼迭代web.Lists?只需直接得到一個列表,並避免一些多餘的CPU週期:SPWeb.GetList()

+0

item.Workflows.Count> 0始終0對我來說。你知道爲什麼嗎? – Muhammedh