2

我在我的SharePoint 2007項目下面的場景。 我有定時器作業定義,每30分鐘從SQL數據庫表更新SharePoint列表。SharePoint列表項事件處理程序

我也開始加入項事件處理程序,我的名單,所以它不允許用戶添加新項目從SharePoint用戶界面的列表。 換句話說,新的列表項只能通過SharePoint對象模型添加到計時器作業定義中,並且不應允許從UI添加新項。

我的問題是 - 即使它從計時器作業定義增加了新的項目正在執行的事件處理程序,我可以以某種方式在事件處理程序是如何檢查的項目已經被添加(通過對象模型或通過用戶界面)。

非常感謝, Hrayr

回答

2

夫婦爲你的選擇。從您的計時器作業

  • 在列表中設置一個標誌

    國旗插入,無論是像「AddedFromTimerJob」(可以從UI隱藏),或添加一些東西到SPListItem.Properties

  • 在你的事件接收器檢查一列對於國旗/財產 - 如果它的存在讓它通過,如果不是則拒絕。

Disable the event receiver for the thread, do your insert, re-enable event receiver.

+0

謝謝你的回覆!是的,我也關於標誌和禁用事件處理程序,但在這種情況下有一個大問題,例如我的計時器作業過程100s行,它需要很長時間來執行它,如果我設置一些標誌或禁用事件,那麼在那段時間如果有人試圖通過UI事件處理程序添加/更新項目將不會被解僱。我在想也許在SPItemEventProperties中有一些屬性可以指示我們從 – Hrayrd

+0

中觸發事件的位置該標誌不禁用它,只是讓接收器接受它,所以沒問題。根據第二條鏈接,提供的代碼禁止它僅用於插入線程(即單個請求)並在之後重新啓用它 - 所以再次沒有問題。 – Ryan

+0

瑞恩,非常感謝你!最後一個問題,只是爲了確保我得到了正確的答案。所以你提供的鏈接 - 如果我在一些需要3分鐘執行並且添加大量新項目之前禁用它,然後在完成時啓動它,在這種情況下,如果在3分鐘內有人從UI會嘗試添加新的項目,該列表事件將被觸發OK?我對嗎?如果我正確地得到它,這將是很好的解決方案! – Hrayrd

1

首先,爲什麼不設置權限,不允許增加新的項目,而不是提供用戶通過eventreceiver一個錯誤,他試圖將項目添加到列表中後?

關於這個問題 - 這是可能暫時禁用事件觸發。例如,當您的計時器作業運行時,禁用事件觸發直到完成。但它可能不適合所有情況,因爲它會禁用列表的所有事件接收器。但是,如果你沒有任何事件接收者在ItemAdding/ItemAdded事件上添加數據,那麼它就可以工作。

代碼禁用事件引發一時能喜歡這裏:Disable Sharepoint item events firing during item update(它適用於任何事件,而不僅僅是更新)

+0

僅僅是從事件接收器「禁用事件觸發」嗎?無論如何,聽起來像使用權限方案是要走的路,除非有一些禁止情況 –

+0

@Greg,權限方案將阻止用戶添加項目。但是關於事件接收器問題,的確,您只能禁用事件接收器的事件觸發。但[每個會話(線程)設置[事件接收器啓用/禁用狀態]](http://blogs.syrinx.com/blogs/sharepoint/archive/2008/11/10/disabling-event-firing-on-splistitem-update -differently.aspx),而不是每個事件接收器。因此,我們解決方法是創建一個繼承SPItemEventReceiver並關閉(全部)事件接收器以外的事件接收器的類:) –

0

您可以查看誰正在執行的項目,增加操作的用戶帳戶。

如果System.Threading.Thread.CurrentPrincipal.Identity是它運行計時器作業的帳戶,設置SPEventPropertiesBase.Cancel = FALSE;