2

SharePoint 2007プロジェクトでは、次のようなシナリオがあります。 私は30分ごとにSQLデータベーステーブルからSharePointリストを更新するタイマージョブの定義を持っています。SharePointリストアイテムイベントハンドラ

私のリストにアイテムイベントハンドラも追加されているため、ユーザーはSharePointユーザーインターフェイスのリストに新しいアイテムを追加することはできません。 つまり、新しいリストアイテムは、SharePointオブジェクトモデルを介してタイマージョブ定義にのみ追加することができ、UIから新しいアイテムを追加できないようにする必要があります。

私の問題は、 - タイマージョブ定義から新しい項目を追加した場合でもイベントハンドラが実行されています。オブジェクトハンドラで項目がどのように追加されたか(オブジェクトモデルやユーザーインターフェイス経由で)どうにかチェックできますか?

多くのおかげで、あなたのためのオプションの Hrayr

答えて

2

カップル。あなたのイベントレシーバチェックで

リストにフラグを設定して、あなたのタイマージョブから

旗挿入

  • 、「AddedFromTimerJob」などのいずれかの列(UIから隠し作ることができる)、またはSPListItem.Properties
  • に何かを追加フラグ/プロパティーの場合 - 存在する場合はそれを、それ以外の場合は拒否します。

たり、新しいアイテムを追加するのではなく、彼はリストに項目を追加しようとした後eventreceiverを経由して、エラーをユーザに提供することはできません。アクセス許可を設定していない理由は、すべてのDisable the event receiver for the thread, do your insert, re-enable event receiver.

+0

返信いただきありがとうございます!はい、私はまたフラグとイベントハンドラを無効にするが、その場合は大きな問題があります例えば、私のタイマージョブの行の100sプロセスと私はいくつかのフラグを設定するか、またはイベントを無効にするには、その間、誰かがUIイベントハンドラを介してアイテムを追加/更新しようとすると、解雇されません。おそらく、SPItemEventPropertiesにいくつかのプロパティがあり、イベントがどこから発生したのかを指摘できます。 – Hrayrd

+0

フラグはそれを無効にしていません。受信者に受け付けさせても問題ありません。その2番目のリンクによれば、提供されたコードはスレッドを挿入するだけのためにそれを無効にし(つまり、単一の要求)、それを再び有効にします。 – Ryan

+0

Ryan、ありがとう!最後の質問は、私が正しくそれを持っていることを確認することです。あなたが提供したリンク - もし私が実行するために3分と言うといくつかのプロセスが実行され、新しいアイテムがたくさん追加されたら、それを無効にしたら、終了したら起動します。そのリストに新しいアイテムを追加しようとしますイベントは解雇されるでしょうか?私は正しい?私はそれを正しく得た場合、それは素晴らしい解決策になります! – Hrayrd

1

初?

この問題について、イベントの発生を一時的に無効にすることは可能です。たとえば、タイマージョブが実行されると、終了するまでイベントの起動を無効にします。ただし、すべての状況に適していない可能性があります。すべてのイベント受信者がリストを無効にするためです。しかし、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を設定します。