4

我编写了一个在“页面”列表的“ItemAdded”事件上激活的事件接收器。代码运行良好,但我的问题是 - 在调用我的 Sub ItemAdded 期间,我想更改属于当前列表项的字段的值(在本例中为 aspx 页面)。

我的想法是我可以将“标题”字段配置为另一个值,由我的事件接收器配置,并且当用户在编辑模式下看到页面时,新标题将被保存为页面。这是我目前的尝试:

Public Overrides Sub ItemAdded(ByVal properties As Microsoft.SharePoint.SPItemEventProperties)

 Dim newItem As SPListItem = properties.ListItem
 Dim currentSiteTitle As String = properties.OpenWeb().Title

 UpdateItemTitle(newItem, currentSiteTitle)
 newItem.Update()
 'newItem.SystemUpdate()

End Sub

如您所见,我已尝试过 Update() 和 SystemUpdate(),但在每种情况下,当用户尝试签入页面时,他们都会收到一条消息,指出该页面已被外部修改。另外,在查看页面时,标题字段的值没有改变。

我正在尝试做的事情是可能的,还是有更好的方法?

干杯。贾斯。

4

4 回答 4

3

更改 properties.afterproperties 将解决保存冲突。请注意,afterproperties 是一个哈希表,但您可以这样访问它:

properties.AfterProperties["Title"] = "我的新标题";

于 2009-09-09T11:02:38.987 回答
2

ItemAdd ed Name 说明了一切。它是在添加项目后发生的异步事件,您的问题也是如此。我建议您挂钩 ItemAdding 事件,除非您有理由不这样做。

有关异步和同步的详细信息,请参阅链接

于 2009-08-10T13:30:30.590 回答
0

完成此操作的最佳方法是使用 ItemAdd事件。这将允许您在将 Title 值保存到数据库之前更改它。尝试在 ItemAdded 中更改它们是可能的,但会导致您遇到麻烦。

您是否尝试过添加项目?

于 2009-08-10T13:30:52.523 回答
0

现在从上面开始,我发现当我在讨论组工作时,我可以更改列表项中任何字段的唯一地方是在 ItemUpdating 方法中,在那里我可以将新值分配给 properties.AfterProperties 哈希对应到前面提到的项目名称。

不幸的是,当一个新的回复被添加到讨论中时,这似乎并没有自动运行(也许它是在其他与列表相关的场景中)但是如果我将代码放入 ItemAdded 方法(ItemAdding 也没有被触发)我发现它正在运行,但我无法从那里更改项目,所以我最终在 itemAdded 中得到了类似的内容:

  public override void ItemAdded(SPItemEventProperties properties)
    {
        SPListItem item = properties.ListItem;
        item.Update();
    }

这样做的结果是该字段已更新,但未在显示之前更新,因此当用户被定向到输出页面时,列表将看起来像以前一样,但如果您更改视图或查看回复的详细信息,您将发现它实际上已经改变了它应该的样子。

这对我来说已经足够好了,因为我希望我的大部分回复都会通过电子邮件到达。

于 2009-11-12T17:27:49.100 回答