我很困惑,似乎找不到正确的答案:
当我在事件接收器中使用itemupdating方法在下面的代码中所示更新字段标题,但是我通过"编辑表单"更改的其他字段请勿更改。他们保持原样。
public override void ItemUpdating(SPItemEventProperties properties)
{
SPListitem item = properties.ListItem;
item["Title"] = "title has been changed";
item.Update();
}
如果我将上述代码放在ItemUpdated
中,则不起作用,但是通过UI(编辑表格)进行的更改会生效。
任何人可以帮助我解决这个问题吗?
谢谢
编辑
让我简单地说:
谁能告诉我如何通过事件接收器和其他字段通过列表的编辑形式更新一个或多个字段?
我希望这更清楚。
始终最好使用事件接收器中的项目来更新列表中的字段。而且,您还必须注意,使用
在事件接收器中更新该字段item.update();
开始工作流程时可能会引起一些问题。您可以使用以下更新多个字段的方法。
base.EventFiringEnabled = false;
try
{
item.SystemUpdate(false);
}
finally
{
base.EventFiringEnabled = true;
}
break;
使用itemupdating事件时,请检查properties
参数的AfterProperties
属性。这是一个字典,包含该项目将拥有的所有新值。但是,它包含原始值,所有这些值都是作为字符串的,然后在获取项目属性时会看到的实际值。
在ItemUpdating
事件中执行代码时,发生的是:
- 用户单击保存;
-
ItemUpdating
已发射,并执行您对Update()
的呼叫。 - 此时,您对
Update()
的呼叫将向项目发射另一个ItemUpdating
事件。在上下文中,除了Title
外,没有其他任何字段。 - 控件返回到您占领的方法。要坚持到该项目的更改不再适用。
这就是为什么您会失去用户的更改。
而不是使用ItemUpdated
时,用户所做的更改将持续存在,因为他们在之前保存了,您可以做任何事情。然后,您在ItemUpdated
事件中调用该Update()
。那要么是默默地扔堆栈溢出异常,要么完全疯狂地做其他事情,因为您已经在那里创建了一个无限的递归循环在那里 - 这就是为什么您看不到它更改标题。
如果要为UI保存的项目添加额外的更改,请修改AfterProperties
的 properties
属性,而不是直接在项目中更改它们。