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;