このチュートリアルでは、サイト レベルのワークフローに使用するカスタム アクティビティを Visual Studio で作成する方法について説明します。 サイト レベルのワークフローは、サイト上のリストだけでなく、サイト全体に適用されます。 カスタム アクティビティによって、バックアップのお知らせリストが作成され、そこにお知らせリストの内容がコピーされます。
このチュートリアルでは、次のタスクについて説明します。
サイト レベルのワークフローを作成する。
カスタム ワークフロー アクティビティを作成する。
SharePoint リストを作成および削除する。
リスト間で項目をコピーする。
クイック起動バーにリストを表示する。
注意
お使いのマシンで、Visual Studio ユーザー インターフェイスの一部の要素の名前や場所が、次の手順とは異なる場合があります。 これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。 詳細については、「Visual Studio の設定」を参照してください。
必須コンポーネント
このチュートリアルを実行するには、次のコンポーネントが必要です。
サポート対象エディションの Microsoft Windows および SharePoint。 詳細については、「SharePoint ソリューションの開発要件」を参照してください。
Visual Studio 2010.
サイトのカスタム ワークフロー アクティビティ プロジェクトの作成
まず、カスタム ワークフロー アクティビティを格納し、テストするプロジェクトを作成します。
サイトのカスタム ワークフロー アクティビティ プロジェクトを作成するには
[ファイル] メニューの [新規作成] をポイントし、[新しいプロジェクト] をクリックして、[新しいプロジェクト] ダイアログ ボックスを表示します。
[Visual C#] または [Visual Basic] の [SharePoint] ノードを展開して、[2010] をクリックします。
[テンプレート] ウィンドウでシーケンシャル ワークフローを選択します。
[名前] ボックスに「AnnouncementBackup」と入力し、[OK] をクリックします。
SharePoint カスタマイズ ウィザードが表示されます。
[デバッグに使用するローカル サイト] ページで、[次へ] をクリックして、既定のサイトをそのまま使用します。
また、この段階で、ソリューションの信頼レベルがファーム ソリューション (ワークフロー プロジェクトではこれ以外は選択できません) として設定されます。
[デバッグのワークフロー名の指定] ページで、既定の名前 (AnnouncementBackup - Workflow1) を受け入れます。 ワークフロー テンプレートの種類を [サイト ワークフロー] に変更し、[次へ] をクリックします。
[完了] をクリックし、残りの既定の設定を受け入れます。
カスタム ワークフロー アクティビティ クラスの追加
次に、カスタム ワークフロー アクティビティのコードを記述するためのクラスをプロジェクトに追加します。
カスタム ワークフロー アクティビティ クラスを追加するには
[プロジェクト] メニューの [新しい項目の追加] をクリックして、[新しい項目の追加] ダイアログ ボックスを表示します。
[インストールされたテンプレート] ツリー ビューで [コード] ノードをクリックし、プロジェクト項目テンプレートの一覧で [クラス] をクリックします。 既定の名前である Class1 を使用します。
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 Namespaceusing 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); } } }プロジェクトを保存し、[ビルド] メニューの [ソリューションのビルド] をクリックします。
ツールボックス ([ツールボックス] の [SharePoint ワークフロー] タブ) に、Class1 がカスタム動作として表示されます。
サイトのワークフローへのカスタム アクティビティの追加
次に、カスタム コードを含んだアクティビティをワークフローに追加します。
サイトのワークフローにカスタム アクティビティを追加するには
ワークフロー デザイナーのデザイン ビューで Workflow1 を開きます。
ツールボックスの [Class1] をクリックし、ドラッグして、onWorkflowActivated1 アクティビティの下にドロップします。
プロジェクトを保存します。
サイトのカスタム ワークフロー アクティビティのテスト
次に、プロジェクトを実行して、サイトのワークフローを開始します。 カスタム アクティビティによって、バックアップのお知らせリストが作成され、そこに最新のお知らせリストの内容がコピーされます。 このコードは、バックアップ リストの作成前に、既存のバックアップ リストが存在するかどうかもチェックします。 既存のバックアップ リストが存在する場合は、それを削除します。 また、このコードは、SharePoint サイトのクイック起動バーに新しいリストへのリンクを追加します。
サイトのカスタム ワークフロー アクティビティをテストするには
F5 キーを押して、プロジェクトを実行し、SharePoint に配置します。
クイック起動バーで [リスト] をクリックして、SharePoint サイトで使用できるリストをすべて表示します。 **[お知らせ]**という名前のお知らせのリストが 1 つだけ表示されます。
SharePoint Web ページの一番上にある [サイトの操作] ボタンをクリックし、[サイト ワークフロー] をクリックします。
[新しいワークフローの開始] セクションで、"AnnouncementBackup - Workflow1" のリンクをクリックします。 これで、サイトのワークフローが開始されて、カスタム動作のコードが実行されます。
クイック起動バーに表示される "Announcements Backup" というリンクをクリックします。 [お知らせ] ボックスにあるすべてのお知らせが、この新しいリストにコピーされていることがわかります。