我有一个列表,它有30多列。
我在列表中附加了两个事件处理程序。1.项目更新2.项目更新
在ItemUpdating事件中,我正在检查一个字段值的更改。
在ItemUpdating事件中,如果值发生更改,我希望进行处理。我不能在这里进行比较,因为before属性在列表项中不提供旧值。
处理过程包括少量作业和完成后发送电子邮件。
我正在寻找一种解决方案,当ItemUpdating中的字段值发生变化时,我可以设置位。如果设置为在ItemUpdated中进行处理,请选中此位。
您将无法直接共享值,您将不得不使用辅助方法来持久化数据。
最简单的方法是使用列表项的属性包。
//the list item you want to update (typically SPItemEventProperties.ListItem in an event receiver
SPListItem specialItem = list.Items[0];
specialItem.Properties["some_persisted_key"] = "Some Value here";
specialItem.SystemUpdate(false);
请确保使用SystemUpdate
,否则会遇到创建无休止循环的危险(或者如本文所述提前禁用事件触发)。
在您的ItemUpdated
活动中,您可以访问您的价值,然后只需选择specialItem.Properties["some_persisted_key"]
。
这是对我有效的完整解决方案…非常感谢@moonthear!
它允许我使用当前项目属性包,每次都会使密钥无效,这样它就不会保留值。
public override void ItemUpdating(SPItemEventProperties properties)
{
SPListItem currentItem = properties.List.Items.GetItemById(properties.ListItem.ID);
//I had to null out the key or I would have conflicts the next time the event is triggered
currentItem.Properties["DateChanged"] = null;
currentItem.SystemUpdate(false);
currentItem.Properties["DateChanged"] = true;
currentItem.SystemUpdate(false);
}
public override void ItemUpdated(SPItemEventProperties properties)
{
if (Convert.ToBoolean(Convert.ToBoolean(currentItem.Properties["DateChanged"]))
{
//do something
}
}
启用项目版本(可选最多2或5)
和项目更新使用:
object oldValue = properties.ListItem.Versions[1]["FieldName"];
object currentValue = properties.ListItem.Versions[0]["FieldName"];
版本索引0将始终返回当前项目版本。(这发生在我的测试中,大约有5个修改,我建议再次测试:)
在主列表中创建一列,其中的值是更改,如"OLDVALUES"。使用ItemUpdating
事件中的properties.ListItem["OLDVALUES"]=Value1+";" +Value2+";" +Value3+";";
设置该字段(使用properties.ListItem["Value1"]
获取Value1、Value2和Value3,依此类推)。
现在在项目更新中,像一样使用
string oldValue = properties.ListItem["OLDVALUES"].ToString();
和滑入数组,然后您可以设置全局变量并在代码中访问它们。请记住,它是针对事件接收器的SandBox解决方案,而不是针对农场解决方案。