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 по умолчанию, созданный в библиотеке страниц.

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


person sams5817    schedule 03.04.2011    source источник
comment
Не могли бы вы просто пройтись по вашему коду в режиме отладки и сообщить нам, какая строка вызывает ошибку? Сообщение об ошибке не может найти файл довольно информативно ...   -  person Dennis G    schedule 04.04.2011
comment
После отладки ошибка возникает в manager.StartWorkflow (). надеюсь, что это поможет   -  person sams5817    schedule 07.04.2011


Ответы (2)


Вы также можете передать имя в функцию, указанную выше, сделав это таким образом, и тогда у вас будет функция, которая может запускать любой рабочий процесс для любого элемента:

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);
      }
   }
}
person Tom    schedule 25.06.2011

Во-первых, ваш 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);
        }
    }
}
person Dennis G    schedule 07.04.2011