首页 文章

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

提问于
浏览
1

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

谢谢

2 回答

  • 0

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

    • 在我的列表/库中添加了一个列,当选择了取消按钮时,该列将设置为true .

    • 在我的信息表格中,添加我的"cancel"按钮 .

    • 打开按钮的控件属性,然后选择"Rules"操作 . 关闭属性对话框 .

    • 我为取消按钮添加了一个fomatting规则,因此只有在第一个工作流程已启动时才会显示 . 我还禁用了所有其他编辑控件,因为我只希望取消选项可用 .

    • 在“控制工具”上下文选项卡的“按钮”组中,单击“管理规则” .

    • 添加一个新的Action规则,它应该运行两个动作:首先将我们在第一步中创建的列的值设置为true;第二个使用主数据连接提交数据 .

    • 取消时要运行的工作流应设置为在更改时运行 . 作为第一步,评估上面创建的列,如果为true,则继续worflow . 确保将值设置为false,以便工作流不会无意中运行 .

    希望有所帮助 .

  • 1

    这不是一个糟糕的解决方案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);
    
    
            }
    

相关问题