2011-04-03 4 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» это имя рабочего процесса я хотел начать. Это стандартный рабочий стол по умолчанию, созданный в библиотеке страниц.

Пожалуйста, помогите, спасибо заранее.

+0

Не могли бы вы просто пропустить свой код в режиме отладки и сообщить нам, какая строка вызывает ошибку? Сообщение об ошибке «не может найти файл» довольно дескриптивно ... –

+0

После отладки ошибка попадает на manager.StartWorkflow(). надеюсь, что эта помощь – sams5817

ответ

0

В первую очередь у вас есть using site в пределах using 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); 
     } 
    } 
} 
Смежные вопросы