[2]ItemAddingメソッドを実装する
ItemAddingメソッドを実装します。アイテム追加の前に呼び出されるこのハンドラー内に、アイテムの同名タイトルの存在チェックやアイテム数の上限チェックのコードを記述します。
EventReceiver1クラスのItemAddingメソッドを、リスト2のように修正します。
/// <summary>
/// 項目が追加されています.
/// </summary>
public override void ItemAdding(SPItemEventProperties properties)
{
try
{
// (1)イベントが発生したWebサイトを取得
using (SPWeb webSite = new SPSite(properties.SiteId).OpenWeb(properties.RelativeWebUrl))
{
// (2)「お知らせ」リストのアイテムコレクションを取得
SPListItemCollection items = webSite.Lists[properties.ListTitle].Items;
// (3)リスト内のアイテム数の上限チェック
if (items.Count > 2)
{
properties.Status = SPEventReceiverStatus.CancelWithError;
properties.ErrorMessage = "アイテム数の上限に達しました。";
properties.Cancel = true;
return;
}
// (4)追加しようとしているアイテムのタイトルを取得
string itemTitle = properties.AfterProperties["Title"].ToString();
// (5)タイトル名の存在チェック
foreach (SPListItem item in items)
{
if (itemTitle == item["Title"].ToString())
{
properties.Status = SPEventReceiverStatus.CancelWithError;
properties.ErrorMessage = "同じタイトル名が存在します。";
properties.Cancel = true;
return;
}
}
}
}
catch (Exception ex)
{
properties.Status = SPEventReceiverStatus.CancelWithError;
properties.ErrorMessage = ex.Message;
properties.Cancel = true;
}
}
ItemAddingメソッドのパラメータであるSPItemEventPropertiesクラスのpropertiesオブジェクトには、リストアイテムについての情報が保持されています。
(1)では、SharePointのサイトコレクションを表すSPSiteオブジェクトのOpenWebメソッドにより、イベントが発生したWebサイトのオブジェクトであるSPWebオブジェクトを取得しています。
(2)では、SPWebオブジェクトのListsプロパティから「お知らせ」リストのSPListオブジェクトを取得し、SPListオブジェクトのItemsプロパティにより「お知らせ」リストのアイテムコレクションを取得しています。
(3)では、アイテム数が3個以上だった場合、アイテム追加をキャンセルしています。引数として渡されたSPItemEventPropertiesオブジェクトのStatusプロパティに、SPEventReceiverStatus列挙のCancelWithErrorメンバを設定します。これにより、イベントが取り消されると共にエラーメッセージが表示されます。イベントを続行したい場合には、代わりにContinueメンバを設定します。ErrorMessageプロパティにエラーメッセージを設定し、Cancelプロパティによりイベントがキャンセルされるかどうかを設定します。
(4)では、追加しようとしているアイテムのタイトルを取得しています。SPItemEventPropertiesオブジェクトのAfterPropertiesプロパティにより、イベント発生後のアイテムの各フィールドに対応するキーと値のペアからなるプロパティのハッシュテーブルを取得することができます。
(5)では、アイテムコレクションを列挙して、既に同じタイトル名を持つアイテムが存在しているかどうかをチェックしています。もし存在するなら、イベントをキャンセルします。
[3]ItemDeletingメソッドを実装する
次に、ItemDeletingメソッドを実装します。アイテム削除の前に呼び出されるこのハンドラー内に、アイテムの削除を禁止するコードを記述します。
EventReceiver1クラスのItemDeletingメソッドを、リスト3のように修正します。
/// <summary>
/// 項目が削除されています.
/// </summary>
public override void ItemDeleting(SPItemEventProperties properties)
{
properties.Status = SPEventReceiverStatus.CancelWithError;
properties.ErrorMessage = "リストからアイテムを削除できません。";
properties.Cancel = true;
}
ここでは単純に、すべての場合にイベントをキャンセルするようにしています。これにより、「お知らせ」リストからアイテムの削除を禁止にします。
[4]ItemAddedメソッドを実装する
最後に、ItemAddedメソッドを実装します。アイテム追加の後に呼び出されるこのハンドラー内に、アイテムの有効期限が未設定だった場合、有効期限を今日の日付から1か月後に設定するコードを記述します。
EventReceiver1クラスのItemAddedメソッドを、リスト4のように修正します。
/// <summary>
/// 項目が追加されました.
/// </summary>
public override void ItemAdded(SPItemEventProperties properties)
{
try
{
// (6)追加後のアイテムを取得
SPListItem item = properties.ListItem;
// (7)アイテムの有効期限が未設定の場合、1か月後に設定する
if (item["Expires"] == null)
{
item["Expires"] = DateTime.Now.AddMonths(1);
}
// (8)アイテムの更新
item.Update();
}
catch (Exception ex)
{
properties.Status = SPEventReceiverStatus.CancelWithError;
properties.ErrorMessage = ex.Message;
properties.Cancel = true;
}
}
(6)では、引数として渡されたSPItemEventPropertiesオブジェクトのListItemプロパティにより、追加後のアイテムを表すSPListItemオブジェクトを取得しています。
(7)では、アイテムの有効期限を表すExpiresプロパティを参照し、未設定の場合には今日から1か月後の日付に設定しています。
(8)では、SPListItemオブジェクトのUpdateメソッドにより、アイテムに対する変更をデータベースに反映しています。
これで、サンプルが完成しました。
