在itemupdated和itemupdated事件之间共享值



我有一个列表,它有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解决方案,而不是针对农场解决方案。

相关内容

  • 没有找到相关文章

最新更新