2011-04-03 96 views
2

我想以编程方式在页面库中的itemAdded时启动工作流程。 我做如下:SharePoint 2007:以编程方式启动工作流命中错误

public override void ItemAdded(SPItemEventProperties properties) 
{ 
    SPListItem listItem = properties.ListItem; 

    StartWF(listItem); 
} 

public void StartWF(SPListItem listItem) 
{ 
    using(SPWeb web = listItem.Web) { 
     using(SPSite site = web.Site) { 
      SPWorkflowManager manager = site.WorkflowManager; 
      SPList parentList = listItem.ParentList; 
      SPWorkflowAssociationCollection associationCollection = 
       parentList.WorkflowAssociations; 

      foreach(SPWorkflowAssociation association in 
       associationCollection) { 
       if (association.Name == "APWFAnn2010") { 
        string data = 
         association.AssociationData; 
        SPWorkflow wf = 
         manager.StartWorkflow(listItem, 
            association, 
            association. 
            AssociationData); 
       } 
      } 
     } 
    } 
} 

然后我打这个错误“系统无法找到(从HRESULT异常:0x80070002)指定的文件。

“APWFAnn2010”是工作流的名字,我想开始。它是在页面库中创建的SP默认审批工作流程。

请帮忙,提前谢谢。

+0

你可以在调试模式下单步执行代码并告诉我们哪行会导致错误?错误信息“无法找到文件”是相当具有描述性的... – 2011-04-04 18:26:22

+0

调试后,错误在manager.StartWorkflow()上发生。 希望得到这个帮助 – sams5817 2011-04-07 03:19:40

回答

0

首先你的using siteusing web之内,它应该是另一种方式 - 另一方面,我甚至没有看到你使用SPWeb,那么为什么它在那里呢?其次我将重写代码位:

public override void ItemAdded(SPItemEventProperties properties) 
{ 
    SPListItem listItem = properties.ListItem; 
    spSite = properties.OpenWeb().Site; 
    spWeb = properties.Web; 
    using(spSite) { 
     StartWF(listItem, spSite); 
    } 
} 

public void StartWF(SPListItem listItem, SPSite spSite) 
{ 

    SPList parentList = listItem.ParentList; 
    SPWorkflowAssociationCollection associationCollection = 
     parentList.WorkflowAssociations; 

    foreach(SPWorkflowAssociation association in associationCollection) { 
     if (association.Name == "APWFAnn2010") { 
      association.AutoStartChange = true; 
      association.AutoStartCreate = false; 
      association.AssociationData = string.Empty; 

      spSite.WorkflowManager.StartWorkflow(listItem, 
           association, 
           association.AssociationData); 
     } 
    } 
} 
0

您也可以通过在名称到上面的函数通过做这种方式,然后你必须可以在任何项目启动任何工作流功能:

public void StartWF(SPListItem listItem, SPSite spSite, string wfName) 
{ 
    SPList parentList = listItem.ParentList;  
    SPWorkflowAssociationCollection associationCollection = parentList.WorkflowAssociations;   
    foreach (SPWorkflowAssociation association in associationCollection) 
    { 
     if (association.Name == wfName) 
     { 
      association.AutoStartChange = true; 
      association.AutoStartCreate = false; 
      association.AssociationData = string.Empty; 
      spSite.WorkflowManager.StartWorkflow(listItem, association, association.AssociationData); 
     } 
    } 
} 
相关问题