我很困惑,似乎找不到这个问题的正确答案:
当我在事件接收器中使用ItemUpdating方法来更新下面代码中显示的字段标题时,它可以工作,但我通过“编辑表单”更改的其他字段不会更改。他们保持原样。
public override void ItemUpdating(SPItemEventProperties properties)
{
SPListitem item = properties.ListItem;
item["Title"] = "title has been changed";
item.Update();
}
如果我将上述代码放在ItemUpdated
中,则它不起作用,但通过UI(编辑表单)完成的更改生效。
任何人都可以帮我解决这个问题吗?
谢谢
让我这样简单地说:
任何人都可以告诉我如何通过事件接收者更新一个或多个字段以及通过列表的编辑表单更新其他字段?
我希望这更清楚。
答案 0 :(得分:0)
最好在事件接收器中使用ItemUpdated来更新列表中的字段。 您还必须注意使用
更新事件接收器中的字段item.Update();
启动工作流程时,可能会导致一些问题。您可以使用以下内容 更新多个字段的方法。
base.EventFiringEnabled = false;
try
{
item.SystemUpdate(false);
}
finally
{
base.EventFiringEnabled = true;
}
break;
答案 1 :(得分:0)
使用ItemUpdating事件时,请检查AfterProperties
参数的properties
属性。它是一个字典,包含项目将具有的所有新值。但它包含原始值,所有这些都是字符串,然后再处理为您在获取项属性时看到的实际值。
在ItemUpdating
事件中执行代码时,会发生什么:
ItemUpdating
被解雇并执行您对Update()
的调用。Update()
的调用会向该项目触发另一个ItemUpdating
事件。在它运行的上下文中,除Title
之外没有任何字段发生更改。这就是您失去用户所做更改的原因。
当您使用ItemUpdated
代替时,用户所做的更改会保留,因为它们会在您执行任何操作之前保存。然后在Update()
事件中调用ItemUpdated
。那个要么是静静地抛出堆栈溢出异常,要么做其他完全疯狂的事情,因为你在那里创建了一个无限递归循环 - 这就是你没看到的原因它改变了标题。
如果要为UI保存的项目添加额外更改,请修改AfterProperties
的{{1}}属性,而不是直接在项目中更改它们。