チュートリアル: サイトのカスタム ワークフロー アクティビティの作成

このチュートリアルでは、サイト レベルのワークフローに使用するカスタム アクティビティを Visual Studio で作成する方法について説明します。 サイト レベルのワークフローは、サイト上のリストだけでなく、サイト全体に適用されます。 カスタム アクティビティによって、バックアップのお知らせリストが作成され、そこにお知らせリストの内容がコピーされます。

このチュートリアルでは、次のタスクについて説明します。

  • サイト レベルのワークフローを作成する。

  • カスタム ワークフロー アクティビティを作成する。

  • SharePoint リストを作成および削除する。

  • リスト間で項目をコピーする。

  • クイック起動バーにリストを表示する。

注意

お使いのマシンで、Visual Studio ユーザー インターフェイスの一部の要素の名前や場所が、次の手順とは異なる場合があります。 これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。 詳細については、「Visual Studio の設定」を参照してください。

必須コンポーネント

このチュートリアルを実行するには、次のコンポーネントが必要です。

サイトのカスタム ワークフロー アクティビティ プロジェクトの作成

まず、カスタム ワークフロー アクティビティを格納し、テストするプロジェクトを作成します。

サイトのカスタム ワークフロー アクティビティ プロジェクトを作成するには

  1. [ファイル] メニューの [新規作成] をポイントし、[新しいプロジェクト] をクリックして、[新しいプロジェクト] ダイアログ ボックスを表示します。

  2. [Visual C#] または [Visual Basic][SharePoint] ノードを展開して、[2010] をクリックします。

  3. [テンプレート] ウィンドウでシーケンシャル ワークフローを選択します。

  4. [名前] ボックスに「AnnouncementBackup」と入力し、[OK] をクリックします。

    SharePoint カスタマイズ ウィザードが表示されます。

  5. [デバッグに使用するローカル サイト] ページで、[次へ] をクリックして、既定のサイトをそのまま使用します。

    また、この段階で、ソリューションの信頼レベルがファーム ソリューション (ワークフロー プロジェクトではこれ以外は選択できません) として設定されます。

  6. [デバッグのワークフロー名の指定] ページで、既定の名前 (AnnouncementBackup - Workflow1) を受け入れます。 ワークフロー テンプレートの種類を [サイト ワークフロー] に変更し、[次へ] をクリックします。

  7. [完了] をクリックし、残りの既定の設定を受け入れます。

カスタム ワークフロー アクティビティ クラスの追加

次に、カスタム ワークフロー アクティビティのコードを記述するためのクラスをプロジェクトに追加します。

カスタム ワークフロー アクティビティ クラスを追加するには

  1. [プロジェクト] メニューの [新しい項目の追加] をクリックして、[新しい項目の追加] ダイアログ ボックスを表示します。

  2. [インストールされたテンプレート] ツリー ビューで [コード] ノードをクリックし、プロジェクト項目テンプレートの一覧で [クラス] をクリックします。 既定の名前である Class1 を使用します。

  3. Class1 のすべてのコードを次のコードに置き換えます。

    Imports System
    Imports System.Collections.Generic
    Imports System.Linq
    Imports System.Text
    Imports Microsoft.SharePoint
    
    Namespace AnnouncementBackup
        ' This custom activity will back up all of the announcements 
        ' in the Announcements list on the SharePoint site.
        Public Class Class1
            Inherits System.Workflow.ComponentModel.Activity
            Public Sub New()
                MyBase.New()
            End Sub
    
            ' Triggers when the activity is executed.
            Protected Overrides Function Execute(ByVal executionContext As System.Workflow.ComponentModel.ActivityExecutionContext) As System.Workflow.ComponentModel.ActivityExecutionStatus
                Try
                    ' Get a reference to the SharePoint site.
                    Dim site As SPSite = New SPSite(("http://" + System.Environment.MachineName))
                    Dim web As SPWeb = site.OpenWeb("/")
                    ' Reference the original Announcements list.
                    Dim aList As SPList = web.GetList("/Lists/Announcements")
                    ' If the Announcements Backup list already exists, delete it.
                    Try
                        Dim bList As SPList = web.GetList("/Lists/Announcements Backup")
                        bList.Delete()
                    Catch
                    End Try
                    ' Create a new backup Announcements list and reference it.
                    Dim newAnnID As Guid = web.Lists.Add("Announcements Backup", "A backup Announcements list.", SPListTemplateType.Announcements)
                    Dim bakList As SPList = web.Lists(newAnnID)
                    ' Copy announcements from original to backup Announcements list.
                    For Each item As SPListItem In aList.Items
                        Dim newAnnItem As SPListItem = bakList.Items.Add
                        For Each field As SPField In aList.Fields
                            If Not field.ReadOnlyField Then
                                newAnnItem(field.Id) = item(field.Id)
                            End If
                        Next
                        newAnnItem.Update()
                    Next
                    ' Put the Backup Announcements list on the QuickLaunch bar.
                    bakList.OnQuickLaunch = True
                    bakList.Update()
                Catch errx As Exception
                    System.Diagnostics.Debug.WriteLine(("Error: " + errx.ToString))
                End Try
                Return MyBase.Execute(executionContext)
            End Function
        End Class
    End Namespace
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Microsoft.SharePoint;
    
    namespace AnnouncementBackup
    {
        // This custom activity will back up all of the announcements in 
        // the Announcements list on the SharePoint site.
        public class Class1 : System.Workflow.ComponentModel.Activity
            {
            public Class1()
            { }
    
            // Triggers when the activity is executed.
            protected override System.Workflow.ComponentModel.ActivityExecutionStatus Execute(System.Workflow.ComponentModel.ActivityExecutionContext executionContext)
            {
                try
                {
                    // Get a reference to the SharePoint site.
                    SPSite site = new SPSite("http://" + System.Environment.MachineName);
                    SPWeb web = site.OpenWeb("/");
    
                    // Reference the original Announcements list.
                    SPList aList = web.GetList("/Lists/Announcements");
    
                    // If the Announcements Backup list already exists, delete it.
                    try
                    {
                        SPList bList = web.GetList("/Lists/Announcements Backup");
                        bList.Delete();
                    }
                    catch
                    { }
    
                    // Create a new backup Announcements list and reference it.
                    Guid newAnnID = web.Lists.Add("Announcements Backup", "A backup Announcements list.", SPListTemplateType.Announcements);
                    SPList bakList = web.Lists[newAnnID];
    
                    // Copy announcements from original to backup Announcements list.
                    foreach (SPListItem item in aList.Items)
                    {
                        SPListItem newAnnItem = bakList.Items.Add();
                        foreach (SPField field in aList.Fields)
                        {
                            if (!field.ReadOnlyField)
                                newAnnItem[field.Id] = item[field.Id];
                        }
                        newAnnItem.Update();
                    }
    
                    // Put the Backup Announcements list on the QuickLaunch bar.
                    bakList.OnQuickLaunch = true;
                    bakList.Update();
    
                }
    
                catch (Exception errx)
                {
                    System.Diagnostics.Debug.WriteLine("Error: " + errx.ToString());
                }
    
                return base.Execute(executionContext);
            }
    
    
        }
    }
    
  4. プロジェクトを保存し、[ビルド] メニューの [ソリューションのビルド] をクリックします。

    ツールボックス ([ツールボックス][SharePoint ワークフロー] タブ) に、Class1 がカスタム動作として表示されます。

サイトのワークフローへのカスタム アクティビティの追加

次に、カスタム コードを含んだアクティビティをワークフローに追加します。

サイトのワークフローにカスタム アクティビティを追加するには

  1. ワークフロー デザイナーのデザイン ビューで Workflow1 を開きます。

  2. ツールボックスの [Class1] をクリックし、ドラッグして、onWorkflowActivated1 アクティビティの下にドロップします。

  3. プロジェクトを保存します。

サイトのカスタム ワークフロー アクティビティのテスト

次に、プロジェクトを実行して、サイトのワークフローを開始します。 カスタム アクティビティによって、バックアップのお知らせリストが作成され、そこに最新のお知らせリストの内容がコピーされます。 このコードは、バックアップ リストの作成前に、既存のバックアップ リストが存在するかどうかもチェックします。 既存のバックアップ リストが存在する場合は、それを削除します。 また、このコードは、SharePoint サイトのクイック起動バーに新しいリストへのリンクを追加します。

サイトのカスタム ワークフロー アクティビティをテストするには

  1. F5 キーを押して、プロジェクトを実行し、SharePoint に配置します。

  2. クイック起動バーで [リスト] をクリックして、SharePoint サイトで使用できるリストをすべて表示します。 **[お知らせ]**という名前のお知らせのリストが 1 つだけ表示されます。

  3. SharePoint Web ページの一番上にある [サイトの操作] ボタンをクリックし、[サイト ワークフロー] をクリックします。

  4. [新しいワークフローの開始] セクションで、"AnnouncementBackup - Workflow1" のリンクをクリックします。 これで、サイトのワークフローが開始されて、カスタム動作のコードが実行されます。

  5. クイック起動バーに表示される "Announcements Backup" というリンクをクリックします。 [お知らせ] ボックスにあるすべてのお知らせが、この新しいリストにコピーされていることがわかります。

参照

処理手順

方法: イベント レシーバーを作成する

その他の技術情報

SharePoint ソリューションの開発