2009-05-14 2 views
1

Я хотел бы использовать событие OnWorkflowItemChanged в рабочем процессе машины Windows WSS 3.0, чтобы проверить изменения, внесенные в элемент списка, который запустил рабочий процесс. Свойства этого события включают свойства до и после изменения, и я могу без проблем привязываться к свойствам after и получить набор свойств с измененными значениями элемента списка. Однако привязка перед свойствами всегда пуста, и после некоторых исследований я нашел это http://msdn.microsoft.com/en-us/library/aa979520.aspx, в котором говорится, что свойства доступны только в библиотеках документов, а не в списках.Sharepoint OnWorkflowItemChanged списки свойств до/после

Что я хотел бы знать, если есть обходной путь к этой недостающей функциональности или какой лучший способ получить эту функциональность?

ответ

1

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

Я создал действие пользовательского кода выполнения в инициализации состояния состояния, которое ждет изменения элемента. Следующий код сохраняет свойство поля внутри процесса для доступа после того, как обновление произошло

SPListItem item = workflowProperties.Item; 
item.Update(); 

beforeApplicationChangedProperties = new Hashtable(); 
foreach (SPField field in item.ContentType.Fields) 
{ 
    if (!beforeApplicationChangedProperties.ContainsKey(field.Title)) 
    { 
     beforeApplicationChangedProperties.Add(field.Title, item[field.Id]); 
    } 
} 

Что думают другие?

2

Способ преодоления этой проблемы состоял в использовании предыдущей версии элемента. Конечно, в списке должно быть включено управление версиями.

// get an object referencing the item in the list 
Guid listGuid = new Guid(listId); 
SPList myList = web.Lists[listGuid]; 
SPListItem myItem = myList.GetItemById(itemId); 

// make sure there is at least one previous version to compare 
// 0 -> current version 
// 1 -> previous version 
// 2 -> older version 
// ... 
if (myItem.Versions.Count > 1) 
{ 
    SPListItemVersion newItem = myItem.Versions[0]; 
    SPListItemVersion oldItem = myItem.Versions[1]; 
}