我编写了一个事件接收器,它在“页面”列表的“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(),但在每种情况下,当用户尝试检入页面时,他们会收到一条消息,表明该页面已在外部进行了修改。另外,在查看页面时,标题字段值没有改变。
我正在尝试做什么,或者有更好的方法吗?
干杯。 雅各
答案 0 :(得分:3)
更改properties.afterproperties将解决保存冲突。请注意,afterproperties是一个哈希表,但您可以访问它:
properties.AfterProperties [“Title”] =“我的新标题”;
答案 1 :(得分:2)
ItemAdd ed 名称说明了一切。它是在添加Items之后发生的异步事件,因此你的calse问题也是如此。我建议您挂钩ItemAdding事件,除非您有理由不这样做。
请参阅Link了解有关Asynchronous&amp ;;的详细信息同步
答案 2 :(得分:0)
实现此目的的最佳方法是使用ItemAdd ing 事件。这将允许您在将标题值保存到数据库之前更改它。尝试在ItemAdded中更改它们是可能的,但会引起您遇到的麻烦。
你有没有尝试过ItemAdding?
答案 3 :(得分:0)
现在继续上面的内容,我发现当我与一个讨论组合作时,我可以更改列表项中任何字段的唯一位置是ItemUpdating方法,我可以在其中将新值分配给属性。 AfterProperties哈希对应于前面提到的项目名称。
不幸的是,当一个新的回复被添加到讨论中时,似乎没有自动运行(可能是在其他列表相关的场景中)但是如果我将代码放入ItemAdded方法(ItemAdding也没有被触发)我发现它正在运行,但我无法从那里更改项目,所以我在itemAdded中得到了类似的东西:
public override void ItemAdded(SPItemEventProperties properties)
{
SPListItem item = properties.ListItem;
item.Update();
}
这样做的结果是该字段已更新但不在显示之前,因此当用户被定向到输出页面时,列表将看起来像之前一样,但如果您更改视图或者查看回复的详细信息,您会发现它实际上已按预期更改。
这对我来说已经足够了,因为我希望我的大部分回复都能通过电子邮件到达。