如何从Infopath 2010代码启动SharePoint 2010工作流程?

时间:2011-02-03 20:39:04

标签: sharepoint-2010 workflow infopath sharepoint-workflow

我有一个带有2个按钮的Infopath 2010模板:提交和取消。单击提交按钮时,表单将保存到SharePoint 2010中的文档库,并单击相应的工作流程。然后,用户可以打开表单并通过单击取消取消请求。我想在点击取消时启动不同的工作流程。关于如何做到这一点的任何想法?

由于

2 个答案:

答案 0 :(得分:1)

我还没有找到一种方法来专门从Infopath表单启动工作流程。然而,我找到了一个解决方法;这是我如何设置它:

  1. 在我的列表/库中添加了一个列,当选择了取消按钮时,该列将设置为true。
  2. 在我的信息表格中,添加我的“取消”按钮。
  3. 打开按钮的控件属性,然后选择“规则”操作。关闭属性对话框。
  4. 我为取消按钮添加了一个fomatting规则,因此只有在第一个工作流程启动时才会显示。我还禁用了所有其他编辑控件,因为我只希望取消选项可用。
  5. 在“控制工具”上下文选项卡的“按钮”组中,单击“管理规则”。
  6. 添加新的Action规则,它应该运行两个动作:首先将我们在第一步中创建的列的值设置为true;第二次使用主数据连接提交数据。
  7. 取消时要运行的工作流程应设置为在更改时运行。作为第一步,评估上面创建的列,如果为true,则继续worflow。确保将值设置为false,以便工作流不会无意中运行。
  8. 希望有所帮助。

答案 1 :(得分:0)

这不是一个糟糕的解决方法Nostromo但我们实际上最终使用现成的SharePoint Web服务从InfoPath代码后面启动工作流。这是我们开发的方法。

  public static void StartWorkflow(string siteUrl, string docUrl,string workflowName, List<string> approvers,string description)
        {
            var workflow = new Workflow();
            workflow.Url = siteUrl+ "/_vti_bin/workflow.asmx";
            workflow.Credentials = System.Net.CredentialCache.DefaultCredentials;
            XmlNode assocNode = workflow.GetTemplatesForItem(docUrl);
            XmlNamespaceManager nsmgr = new XmlNamespaceManager(assocNode.OwnerDocument.NameTable);
            nsmgr.AddNamespace("wf", "http://schemas.microsoft.com/sharepoint/soap/workflow/");

            XmlDocument doc = new XmlDocument();
            Guid templateID = new Guid();
            bool workflowFound = false;
            XPathNodeIterator rows = assocNode.CreateNavigator().Select("//wf:WorkflowTemplate", nsmgr);
            while (rows.MoveNext())
            {
                if (rows.Current.GetAttribute("Name", "").ToLower() == workflowName.ToLower())
                {
                    doc.LoadXml(rows.Current.SelectSingleNode("wf:AssociationData/wf:string", nsmgr).Value);
                    XPathNavigator idNode = rows.Current.SelectSingleNode("wf:WorkflowTemplateIdSet", nsmgr);
                    templateID = new Guid(idNode.GetAttribute("TemplateId", ""));
                    workflowFound = true;
                    break;
                }
            }

            if(!workflowFound)
                throw new Exception("System couldn't location the workflow with name: " +workflowName);

            XmlElement xmlRoot = doc.DocumentElement;
            nsmgr = new XmlNamespaceManager(assocNode.OwnerDocument.NameTable);
            nsmgr.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD");
            xmlRoot.SelectSingleNode("/my:myFields/my:Description", nsmgr).InnerText = description;
            XmlNode reviewersNode = xmlRoot.SelectSingleNode("/my:myFields/my:Reviewers", nsmgr);

            reviewersNode.InnerXml = "";

            foreach (var user in approvers)
            {
                XmlNode personNode = reviewersNode.AppendChild(doc.CreateElement("my:Person"));
                XmlNode accountIdNode = personNode.AppendChild(doc.CreateElement("my:AccountId"));
                accountIdNode.InnerText = user;
                XmlNode accountTypeNode = accountIdNode.AppendChild(doc.CreateElement("my:AccountType"));
                accountTypeNode.InnerText = "User";
            }

            XmlNode workflowNode = workflow.StartWorkflow(docUrl, templateID, doc.DocumentElement);


        }