locked
ワークフロータスクのSPListItemからSPWorkflowTaskを取得するには? RRS feed

  • 質問

  • 独自に作成したタスク編集フォームにおいて、ワークフローの情報を表示したいと考えています。

    タスクリストで選択したタスクのオブジェクトからワークフローの情報を取得するにはどうすればよいでしょうか?

     

    タスクリストでタスクの編集を選択すると、リストのGuid(List)と番号(ID)が編集フォームに渡されます。

    それを元に、タスクリスト(SPList)とリストアイテム(SPListItem)のオブジェクトにはアクセスできました。

    しかし、ワークフローの情報を持っているSPWorkflowTaskにキャストをすると、InvalidCastExceptionが発生します。

     

        public class MyEditTask : LayoutsPageBase
        {

            protected override void OnLoad(EventArgs e)
            {
                base.OnLoad(e);

                SPList list = Web.Lists[new Guid(Request.QueryString["List"])];
                SPListItem item = list.GetItemById(Convert.ToInt32(Request.Params["ID"]));

                SPWorkflowTask task = (SPWorkflowTask)item;  <-- InvalidCastExceptionが発生

     

    「ワークフロータスクをSPList.GetItemById()で取得したら、SPWorkflowTaskのオブジェクトが返る」

    ことを期待したのですが、GetType()でみると、SPList.GetItemById()が返すオブジェクトはSPListItemでした。

     

    ワークフローの情報にアクセスするには、SPWorkflowTaskが必要なのですが

    取得するAPIを見つけることができていません。

    SPWorkflowManager, SPWorkflowなどと、相互に変換するAPIはあるのですが

    肝心のタスクリストから選択したListとIDから、SPWorkflowTaskを取得するAPIがわかりません。

     

    なにか情報をお持ちの方がいましたら、教えてください。

     

    #タスクの編集画面で、例えば、「ワークフローを起動したドキュメントの画像ファイルを表示する」など

    #ワークフローの情報が必要になることは、ごくふつうにあると思うのですが…

     

    以上、よろしくお願いします。

    2008年11月26日 2:27

回答

  • 自己フォローです。

     

    その後の調査で、ワークフロータスクの場合、SPListItemのfieldsプロパティに

    ワークフローの情報が設定されていることがわかりました。

     

    タスクリストのリスト定義を確認したところ、リストの設定画面では表示されない列が

    リスト定義内で定義されていました。

    それらうち、WorkflowListIdとWorkflowItemIdの値を利用することで

    ワークフロータスクのリストアイテムから、ワークフローを起動したリストアイテムを取得することができました。

     

        SPList taskList = Web.Lists[new Guid(Request.QueryString["List"])];
        SPListItem taskItem = taskList.GetItemById(Convert.ToInt32(Request.Params["ID"]));

       

        Guid targetListGuid = new Guid((string)taskItem[SPBuiltInFieldId.WorkflowListId]);
        int targetItemId = (int)taskItem[SPBuiltInFieldId.WorkflowItemId];
        SPList targetList = Web.Lists[targetListGuid];
        SPListItem targetItem = targetList.GetItemById(targetItemId);

     

    タスクリストの設定画面では見えない列があることに気づきませんでした。

    #SPSite, SPWebから取得できるオブジェクトモデルのツリービューなどを自作すると

    #開発の効率があがるかもしれません。

     

    以上です。

    2008年11月28日 0:56

すべての返信

  • SPWorkflowTaskの情報にアクセスする方法は

    以下のようなSPWorkflowTaskクラスのStaticメソッドを使用する方法があるとおもいます。


        public static Hashtable GetExtendedPropertiesAsHashtable(SPListItem task);
        public static string GetWorkflowData(SPListItem task);

     

    直接SPWorkflowTask型を取得する方法は

    SPWorkflowTaskCollectionから取得する方法のみですかね。

     

     

     

    2008年11月27日 2:54
  • フォローありがとうございます。

     

     Jeon さんからの引用

    SPWorkflowTaskの情報にアクセスする方法は

    以下のようなSPWorkflowTaskクラスのStaticメソッドを使用する方法があるとおもいます。


        public static Hashtable GetExtendedPropertiesAsHashtable(SPListItem task);
        public static string GetWorkflowData(SPListItem task);

     

    直接SPWorkflowTask型を取得する方法は

    SPWorkflowTaskCollectionから取得する方法のみですかね。

     

    残念ながら上記の方法ではうまくいきませんでした。

     

    GetExtendedPropertiesAsHashtable()は、更新ボタンなどが押されたイベントで

    SPWorkflow.AlterTask(task, htData, fSynchronous)のhtDataを生成するとき

    などに利用するAPIのようです。

    Page_Load()の時点では何も値は設定されていませんでした。

     

    GetWorkflowData()の戻り値のstringを確認したところ、スタイルシート?のような文字列の羅列で

    有益な情報が含まれているのかよくわかりませんでした。

     

    SPWorkflowTaskCollectionは、SPWorkflowTask, SPWorkflowManager, SPWorkflowのAPIで

    お互いのオブジェクトどうしの変換で現れるのですが

    肝心の、ワークフロータスクのリストアイテムは、その輪の中に含まれていませんでした。

     

    以上です。

    2008年11月27日 11:18
  • 自己フォローです。

     

    その後の調査で、ワークフロータスクの場合、SPListItemのfieldsプロパティに

    ワークフローの情報が設定されていることがわかりました。

     

    タスクリストのリスト定義を確認したところ、リストの設定画面では表示されない列が

    リスト定義内で定義されていました。

    それらうち、WorkflowListIdとWorkflowItemIdの値を利用することで

    ワークフロータスクのリストアイテムから、ワークフローを起動したリストアイテムを取得することができました。

     

        SPList taskList = Web.Lists[new Guid(Request.QueryString["List"])];
        SPListItem taskItem = taskList.GetItemById(Convert.ToInt32(Request.Params["ID"]));

       

        Guid targetListGuid = new Guid((string)taskItem[SPBuiltInFieldId.WorkflowListId]);
        int targetItemId = (int)taskItem[SPBuiltInFieldId.WorkflowItemId];
        SPList targetList = Web.Lists[targetListGuid];
        SPListItem targetItem = targetList.GetItemById(targetItemId);

     

    タスクリストの設定画面では見えない列があることに気づきませんでした。

    #SPSite, SPWebから取得できるオブジェクトモデルのツリービューなどを自作すると

    #開発の効率があがるかもしれません。

     

    以上です。

    2008年11月28日 0:56