Sharepoint 2010 通过SharePoint表单和列表项事件接收器更新字段

Sharepoint 2010 通过SharePoint表单和列表项事件接收器更新字段,sharepoint-2010,Sharepoint 2010,我很困惑,似乎找不到这个问题的正确答案: 当我在事件接收器中使用ItemUpdate方法更新字段标题时,如下面代码中所示,它可以工作,但我通过“编辑表单”更改的其他字段不会更改。他们保持原样 public override void ItemUpdating(SPItemEventProperties properties) { SPListitem item = properties.ListItem; item["Title"] = "title has been chang

我很困惑,似乎找不到这个问题的正确答案:

当我在事件接收器中使用ItemUpdate方法更新字段标题时,如下面代码中所示,它可以工作,但我通过“编辑表单”更改的其他字段不会更改。他们保持原样

public override void ItemUpdating(SPItemEventProperties properties)
{
    SPListitem item = properties.ListItem;
    item["Title"] = "title has been changed";
    item.Update();
}
如果我将上述代码放入
ItemUpdated
中,它将不起作用,但通过UI(编辑表单)所做的更改将生效

有人能帮我解决这个问题吗

多谢各位

编辑 让我简单地这样说:

谁能告诉我如何通过事件接收器更新一个或多个字段,以及如何通过列表的编辑形式更新其他字段


我希望这更清楚。

最好使用事件接收器中的ItemUpdated来更新列表中的字段。 还必须注意,使用

item.Update()

启动工作流时可能会导致一些问题。您可以使用以下命令 更新多个字段的方法

               base.EventFiringEnabled = false;
               try
               {
                   item.SystemUpdate(false);
               }
               finally
               {
                   base.EventFiringEnabled = true;
               }
               break; 

使用ItemUpdate事件时,请检查
properties
参数的
AfterProperties
属性。它是一个包含该项将具有的所有新值的字典。不过,它包含原始值,所有这些值都作为字符串,然后被处理为获取项目属性时将看到的实际值

当您在
项目更新
事件中执行代码时,会发生以下情况:

  • 用户点击保存
  • ItemUpdating
    被激发,并在调用
    Update()
    之前执行
  • 此时,您对
    Update()
    的调用将向该项触发另一个
    ItemUpdating
    事件。在它运行的上下文中,除了
    标题
    之外,没有其他字段发生更改
  • 控件返回到您重写的方法。要持久化到该项的更改不再应用
这就是为什么您会丢失用户所做的更改

当您改用
ItemUpdated
时,用户所做的更改将被持久化,因为这些更改在您执行任何操作之前被保存。然后在
ItemUpdated
事件中调用该
Update()
。它要么默默地抛出一个堆栈溢出异常,要么做一些完全疯狂的事情,因为您在那里创建了一个无限递归循环——这就是为什么您没有看到它更改标题的原因


如果要向UI保存的项目添加额外更改,请修改
属性
AfterProperties
属性,而不是直接在项目中更改它们。

在代码示例之前的段落中,您说代码示例在
项目更新
中起作用。然后在代码示例之后,您说它在
项目更新中不起作用。
是哪一个?抱歉,但是在代码之后,我使用了ItemUpdated这个词,而不是ItemUpdated。请再读一遍,很抱歉。你能为你试图设置的1个或2个其他字段发布示例代码吗?我怀疑您可能没有使用正确的字段名。