2009-08-10 53 views
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 

正如你所看到的,我都試過更新()和SystemUpdate(),但在每種情況下,當用戶試圖在頁面來檢查,他們得到的消息該頁面已被外部修改。另外,在查看頁面時,標題字段值沒有改變。

是我想盡一切努力,還是有更好的辦法?

乾杯。 Jas。

回答

2

商品添加編輯名稱說這一切。它是在添加Items之後發生的異步事件,您的Calse也是如此。我建議你勾住ItemAdding事件,除非你有理由不這樣做。

請參考Link的異步&詳細同步

+4

請注意,在ItemAdding事件中,listItem不可用。使用AfterProperties []代替。 – 2009-08-10 18:49:31

0

做到這一點是使用荷蘭國際集團事件ItemAdd 的最好方法。這將允許您在保存到數據庫之前更改標題值。嘗試在ItemAdded中更改它們是可能的,但會導致您遇到的麻煩。

您是否試過ItemAdding?

+0

Alex和kusek都對延遲迴復表示歉意,但我現在已經轉移到另一個項目。因爲我還沒有厭倦ItemAdded事件,所以稍後我想重新討論這個問題。 – 2009-08-11 12:03:41

3

更改properties.after屬性將避免保存衝突。請注意,afterproperties是散列表,但您可以訪問它:

properties.AfterProperties [「Title」] =「My New Title」;

+0

我一直在做另一個項目,所以我沒有機會查看你的答案。我會繞過它,因爲我想標記這個問題的答案,只是爲了保持乾淨。 – 2009-09-28 10:33:51

+0

在ItemUpdating中運行時,這對我來說非常合適。應該標記爲答案。 – 2012-09-04 06:13:22

+2

在'ItemAdded','ItemUpdated'事件上這不起作用,並且會拋出'InvalidOperationException',並帶有以下消息:'該事件不支持屬性的更改。 – 2012-09-28 08:48:00

0

接下來從上面我發現,當我在討論組中工作時,唯一可以更改列表項中的任何字段的地方是ItemUpdating方法,我可以將新值分配給屬性.AfterProperties哈希對應於前面提到的項目名稱。

不幸的是,當一個新的回覆被添加到討論中時(可能是在其他列表相關場景中),似乎並沒有自動運行,但是如果我將代碼放入ItemAdded方法中(ItemAdding也未被觸發)我發現,它正在運行,但我不能將項目從那裏改變,所以我結束了在itemAdded是這樣的:

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

這樣做的結果是,該領域被更新,但不在顯示之前,這樣當用戶被引導到輸出頁面時,列表將看起來像以前一樣,但如果您更改視圖或查看回復的詳細信息,您將發現它實際上已經改變了,因爲它應該是。

這對我來說已經夠好了,因爲我預計我的大部分回覆都會通過電子郵件到達。

相關問題