ワークフローの開始フォームおよび変更フォームで連絡先データにアクセスする

最終更新日: 2009年11月30日

適用対象: SharePoint Server 2010

Microsoft SharePoint Foundation は、ワークフローで使用される Office InfoPath 2007 フォームからのデータを XML としてワークフロー インスタンスに送信します。これには、ユーザーが Contact Selector コントロールで指定した連絡先データが含まれます。このデータをワークフローで使用するには、渡されたフォーム XML を解析して連絡先データにアクセスする必要があります。

SharePoint Foundation がフォーム XML データを渡す場所は、ワークフロー フォームの種類によって異なります。

  • ワークフロー開始フォームの場合、SharePoint Foundation は、フォーム データ全体を XML 文字列として OnWorkflowActivated アクティビティの WorkflowProperties.InitiationData プロパティに渡します。

    このワークフロー アクティビティの詳細については、Windows SharePoint Services 3.0 SDK を参照してください。

  • ワークフロー変更フォームの場合、SharePoint Foundation は、フォーム データ全体を XML 文字列として EnableWorkflowModification アクティビティの ContextData プロパティに渡します。

    このワークフロー アクティビティの詳細については、Windows SharePoint Services 3.0 SDK を参照してください。

注意

ワークフロー タスク フォームの場合は、フォーム データは XML 文字列ではなくハッシュ テーブル オブジェクトとして渡されます。タスク フォームで連絡先データにアクセスする方法については、「How to: Access Contact Data in Workflow Edit Task Forms」を参照してください。

連絡先データ XML のスキーマについては、「[方法] InfoPath ワークフロー フォーム上の [Contact Selector] コントロールを構成する」を参照してください。

フォーム XML を解析して連絡先データを取得する場合、次の 2 とおりの方法を使用できます。

  • Office SharePoint Server 2007 に付属するヘルパー クラスの使用。Microsoft.Office.Workflow.Utility 名前空間に、Form クラスや Contact クラスなど、連絡先データの逆シリアル化およびアクセスに利用するために設計されたクラスが含まれています。

    Form クラスには、フォームのフィールドに対応するキーと値の組み合わせを使用して InfoPath フォーム フィールドをハッシュ テーブル オブジェクトに逆シリアル化するメソッドが含まれています。

    Contact クラスには、Contact Selector データのシリアル化と逆シリアル化、および連絡先の関連データへのアクセスを行うメソッドが含まれています。

  • Microsoft .NET Framework 2.0 に付属する XML 逆シリアル化機能の使用。

ワークフローの関連付けフォームおよび開始フォームの詳細については、「ワークフローの関連付けと初期化フォーム (Microsoft SharePoint Server 2010)」を参照してください。

Form クラスと Contact クラスを使用してワークフローの開始フォームまたは変更フォームで Contact Selector コントロール データにアクセスするには

  • 次の処理を行うコードをワークフローに追加します。

    1. XmlToHashtable メソッドを使用して、OnWorkflowActivated アクティビティの WorkflowProperties プロパティで指定された変数に格納されている開始データからハッシュ テーブルを作成します。

    2. ToContacts メソッドを使用して、ハッシュ テーブルから Contact オブジェクトの配列を作成します。

      次に例を示します。

      Hashtable ht = 
      Form.XmltoHashtable(workflowProperties.InitiationData);
      Contacts[] contacts = 
      Contact.ToContacts(ht["myUsers"].ToString());
      
      Dim ht As Hashtable = Form.XmltoHashtable(workflowProperties.InitiationData)
      Dim contacts() As Contacts = Contact.ToContacts(ht("myUsers").ToString())
      

      この例では、OnWorkflowActivated アクティビティの WorkflowProperties プロパティに指定された変数の名前は workflowProperties です。コードの最初の行では、XmlToHashtable メソッドを使用して、この変数の InitiationData プロパティからハッシュ テーブルを作成します。コードでは、次に、ハッシュ テーブル内の連絡先データを表すキーと値の組み合わせから文字列を生成し、ToContacts メソッドを呼び出すことによって、Contact オブジェクトの配列を作成します。

      注意

      Contact Selector コントロール データを表すキーと値の組み合わせにアクセスするには、フォーム上のコントロールの名前を使用します。この例では、コントロールの名前は myUsers です。

.NET Framework XmlSerializer クラスを使用してワークフローの開始フォームまたは変更フォームで Contact Selector コントロール データにアクセスするには

  1. 開始フォームまたは変更フォームのスキーマを展開します。

    1. Office InfoPath 2007 で、保存して発行したワークフロー フォームを開きます。

    2. [ファイル] メニューの [ソース ファイルとして保存] をクリックします。フォーム ソース ファイルを保存する場所を参照し、[OK] をクリックします。

    InfoPath はスキーマ ファイルなどのフォーム ソース ファイルのコレクションを、指定された場所に保存します。フォーム スキーマ ファイルは常に myschema.xsd という名前になります。

  2. Microsoft Visual Studio 2005 のコマンド ライン ツール xsd.exe を使用して、フォーム スキーマから新しいクラス ファイルを生成します。Visual Studio 2005 の既定では、xsd.exe コマンド ライン ツールは C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin にインストールされます。ここで C: は Visual Studio をインストールしたドライブを表します。

    1. Visual Studio コマンド ライン プロンプトを開きます。[スタート] ボタンをクリックし、[すべてのプログラム]、[Microsoft Visual Studio 2005]、[Visual Studio ツール] の順にポイントし、[Visual Studio 2005 コマンド プロンプト] をクリックします。

    2. フォーム スキーマ (.xsd) ファイルの場所に移動し、xsd myschema.xsd /c /o:output_directory コマンドを実行します。

      このコマンドは、フォーム スキーマに基づいて新しいクラス ファイルを生成します。このファイルにはスキーマ ファイルと同じ名前が付けられます。ファイル内のクラスにはスキーマのルート要素と同じ名前が付けられます (これはフォーム フィールド コレクションと同じ名前です)。

      このクラスには、フォーム上の [Contact Selector] コントロールと同じ名前で、型が Person の配列が含まれています。

  3. Visual Studio で、新しいクラス ファイルをワークフロー プロジェクトに追加します。

  4. XML フォーム文字列全体を、フォーム .xsd ファイルから生成したクラスと同じ型のオブジェクトに逆シリアル化するコードをワークフローに追加します。

    次の例では、フォーム フィールド コレクションは MyFields という名前なので、フォーム .xsd ファイルから生成されたクラスも MyFields という名前になります。

    XmlSerializer serializer = new XMLSerializer(typeof(MyFields));
    xmlTextReader reader = new XMLTextReader(new 
    System.IO.StringReader(workflowProperties.InitiationData));
    MyFields fields = serializer.Deserialize(reader);
    
    Dim serializer As XmlSerializer = New XMLSerializer(GetType(MyFields))
    Dim reader As xmlTextReader = New XMLTextReader(New System.IO.StringReader(workflowProperties.InitiationData))
    Dim fields As MyFields = serializer.Deserialize(reader)
    
  5. 連絡先情報にアクセスするために、フォーム上の各種コントロールと同じ名前の各種クラス プロパティを使用して、フォーム情報にアクセスするコードを追加します。

    次の例では、フォーム上の [Contact Selector] コントロールの名前は Users です。したがって、連絡先の accountID データにアクセスするために、コードで Users[i].accountID プロパティにアクセスします。

    string accountID = fields.Users[i].accountID;
    
    Dim accountID As String = fields.Users(i).accountID
    

注意

Contact ユーティリティ クラスで提供される機能を利用する場合は、FromName 静的メソッドを使用して、前のコードで返されたアカウント ID から Contact オブジェクトを作成できます。

関連項目

タスク

[方法] InfoPath に [Contact Selector] を追加する

[方法] InfoPath ワークフロー フォーム上の [Contact Selector] コントロールを構成する

[方法] ワークフロー内の関連付けと開始のフォーム データにアクセスする

[方法] 関連付けデータと初期データを使用するワークフロー フォームを設計する

概念

ワークフローの InfoPath フォーム

InfoPath ワークフロー フォームで [Contact Selector] コントロールを使用する

その他の技術情報

How to: Access Contact Data in Workflow Edit Task Forms