我有一个带有2个按钮的Infopath 2010模板:提交和取消 . 单击提交按钮时,表单将保存到SharePoint 2010中的文档库,并单击相应的工作流程 . 然后,用户可以打开表单并通过单击取消取消请求 . 我想在点击取消时启动不同的工作流程 . 关于如何做到这一点的任何想法?
谢谢
我还没有找到一种方法来专门从Infopath表单启动工作流程 . 然而,我找到了一个解决方法;这是我如何设置它:
在我的列表/库中添加了一个列,当选择了取消按钮时,该列将设置为true .
在我的信息表格中,添加我的"cancel"按钮 .
打开按钮的控件属性,然后选择"Rules"操作 . 关闭属性对话框 .
我为取消按钮添加了一个fomatting规则,因此只有在第一个工作流程已启动时才会显示 . 我还禁用了所有其他编辑控件,因为我只希望取消选项可用 .
在“控制工具”上下文选项卡的“按钮”组中,单击“管理规则” .
添加一个新的Action规则,它应该运行两个动作:首先将我们在第一步中创建的列的值设置为true;第二个使用主数据连接提交数据 .
取消时要运行的工作流应设置为在更改时运行 . 作为第一步,评估上面创建的列,如果为true,则继续worflow . 确保将值设置为false,以便工作流不会无意中运行 .
希望有所帮助 .
这不是一个糟糕的解决方案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); }
2 回答
我还没有找到一种方法来专门从Infopath表单启动工作流程 . 然而,我找到了一个解决方法;这是我如何设置它:
在我的列表/库中添加了一个列,当选择了取消按钮时,该列将设置为true .
在我的信息表格中,添加我的"cancel"按钮 .
打开按钮的控件属性,然后选择"Rules"操作 . 关闭属性对话框 .
我为取消按钮添加了一个fomatting规则,因此只有在第一个工作流程已启动时才会显示 . 我还禁用了所有其他编辑控件,因为我只希望取消选项可用 .
在“控制工具”上下文选项卡的“按钮”组中,单击“管理规则” .
添加一个新的Action规则,它应该运行两个动作:首先将我们在第一步中创建的列的值设置为true;第二个使用主数据连接提交数据 .
取消时要运行的工作流应设置为在更改时运行 . 作为第一步,评估上面创建的列,如果为true,则继续worflow . 确保将值设置为false,以便工作流不会无意中运行 .
希望有所帮助 .
这不是一个糟糕的解决方案Nostromo但我们实际上最终使用现成的SharePoint Web服务从InfoPath代码后面启动工作流 . 这是我们开发的方法 .