SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Visual Studio 2010によるSharePoint 2010開発の基本

SharePoint 2010のイベントレシーバーの作成

Visual Studio 2010によるSharePoint 2010開発の基本(4)

[2]ItemAddingメソッドを実装する

 ItemAddingメソッドを実装します。アイテム追加の前に呼び出されるこのハンドラー内に、アイテムの同名タイトルの存在チェックやアイテム数の上限チェックのコードを記述します。

 EventReceiver1クラスのItemAddingメソッドを、リスト2のように修正します。

リスト2 ItemAddingメソッドの実装(EventReceiver1.cs)
/// <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のように修正します。

リスト3 ItemDeletingメソッドの実装(EventReceiver1.cs)
/// <summary>
/// 項目が削除されています.
/// </summary>
public override void ItemDeleting(SPItemEventProperties properties)
{
    properties.Status = SPEventReceiverStatus.CancelWithError;
    properties.ErrorMessage = "リストからアイテムを削除できません。";
    properties.Cancel = true;
}

 ここでは単純に、すべての場合にイベントをキャンセルするようにしています。これにより、「お知らせ」リストからアイテムの削除を禁止にします。

[4]ItemAddedメソッドを実装する

 最後に、ItemAddedメソッドを実装します。アイテム追加の後に呼び出されるこのハンドラー内に、アイテムの有効期限が未設定だった場合、有効期限を今日の日付から1か月後に設定するコードを記述します。

 EventReceiver1クラスのItemAddedメソッドを、リスト4のように修正します。

リスト4 ItemAddedメソッドの実装(EventReceiver1.cs)
/// <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メソッドにより、アイテムに対する変更をデータベースに反映しています。

 これで、サンプルが完成しました。

次のページ
まとめ

この記事は参考になりましたか?

Visual Studio 2010によるSharePoint 2010開発の基本連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 広瀬 嘉久(株式会社ジェイテックジャパン)(ヒロセ ヨシヒサ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5984 2011/06/23 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー