1

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

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

public override void ItemUpdating(SPItemEventProperties properties)
{
    SPListitem item = properties.ListItem;
    item["Title"] = "title has been changed";
    item.Update();
}

如果我将上面的代码放入ItemUpdated它不起作用,但通过 UI(编辑表单)完成的更改会生效。

谁能帮我解决这个问题?

谢谢你

编辑

让我简单地这样说:

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

我希望这更清楚。

4

2 回答 2

0

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

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

  • 用户点击保存;
  • ItemUpdating被触发并执行到您调用Update().
  • 此时,您的调用会Update()触发该项目的另一个ItemUpdating事件。在它运行的上下文中,除了Title.
  • 控制权返回到您覆盖的方法。将保留在项目上的更改不再适用。

这就是您丢失用户所做更改的原因。

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

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

于 2013-07-11T18:18:41.540 回答
0

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

项目.更新();

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

               base.EventFiringEnabled = false;
               try
               {
                   item.SystemUpdate(false);
               }
               finally
               {
                   base.EventFiringEnabled = true;
               }
               break; 
于 2012-12-21T05:52:02.897 回答