zoukankan      html  css  js  c++  java
  • 在InfoPath表单内提交表单并启动工作流

    在InfoPath表单内提交表单并启动工作流

    MOSS中对工作流的强大支持,让我们可以做很多应用。

    举个例子,我们可以用表单库做审批表单,然后给这个表单库附加一个流程。

    我们可能希望用户在填写表单的时候,在表单中填一些在启动工作流时需要用的信息,比如设置审批人等等。

    我们的表单会像下面这样,包括待审批内容,和设置审批者等其他工作流设置。

    我们也希望用户在点“保存”的时候,提交表单并同时根据用户设置的审批人来启动工作流。

    MOSS默认的模式是,提交完表单以后,在另一个页面启动工作流,需要做两步操作,这样的用户体验比较不好

    最好的体检就是“一步到位”,只需要在一个界面完成提交和启动的工作。

    所以,我们就需要在InfoPath Form Services表单中的“保存”按钮上做一些工作来满足这种需求。

    我提供的思路如下:

    利用VSTA给表单库的表单模板里的“保存”按钮添加代码来完成提交表单和启动工作流的任务

    1)设计表单模板的时候,为InfoPath表单设置一个提交连接(DataConnection)

    可以看到这个提交连接会包括提交到的文档库的URl和默认的文件名命名规则。这个提交连接是我们提交表单和启动工作流所需要的。

    2)给InfoPath表单的“保存”的按钮添加代码(以下代码为示例):

    XPathNavigator field2 = this.MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:field2", NamespaceManager);
    //取到提交连接的对象,FileSubmitConnection对应的是提交到SharePoint文档库的连接类
    FileSubmitConnection osssubmit = (FileSubmitConnection)this.DataConnections["OSSSubmit"];
    //我们可以通过表单里面的某个项目来作为表单提交的时候的文件名,或者用其他的命名规则,或者用户指定都可以
    string tempfilename = field2.Value +"_"+ DateTime.Now.ToString().Replace(":","_");
    //设置提交表单的文件名
    osssubmit.Filename.SetStringValue(tempfilename+".xml");
    //执行提交
    osssubmit.Execute();
    
    //到这一步,表单已经提交到了文档库,接下来启动表单的工作流
    try
    {
    //根据提交连接的FolderUrl属性可以取到文档库所在的网站集
    SPSite mysite = new SPSite(osssubmit.FolderUrl);
    //根据表单的名称和FolderUrl可以把提交上去的表单的完整URL拼出来
    string fileurl = osssubmit.FolderUrl+"/"+tempfilename+".xml";
    if(osssubmit.FolderUrl.EndsWith("/"))
    {
    fileurl = osssubmit.FolderUrl+tempfilename+".xml";
    }
    //利用FolderUrl可以根据SPWeb.GetList方法取到文档库对应的SPList对象
    SPList mylist = mysite.RootWeb.GetList(osssubmit.FolderUrl);
    //根据前面拼出来的已上传得表单的完整URL可以取到表单对应的SPListItem对象
    SPListItem mylistitem = mysite.RootWeb.GetListItem(fileurl);
    
    //取到文档库绑定的某个工作流关联
    SPWorkflowAssociation mywfass = mylist.WorkflowAssociations.GetAssociationByName("Review", System.Globalization.CultureInfo.CurrentCulture);
    
    //EventData中就是工作流启动的时候需要的参数,比如审批人等信息,用表单中用户设置的启动参数替换EventData中的相应信息即可 

    /*关联信息定义了工作流启动的参数,格式如下XML所示,我们需要做的只是用表单里面的对应字段值替换这个XML里面的对应内容即可,红色标示的部分

    <my:myFields xml:lang="zh-CN" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2006-12-16T05:28:36"xmlns:xd="http://schemas.microsoft.com/office/infopath/2003">

    <my:instructions>Review it!</my:instructions>

    <my:assignees>litwareinc\Administrator;litwareinc\DemoUser2</my:assignees>

    </my:myFields>

    */
    string EventData = mywfass.AssociationData;
    mysite.AllowUnsafeUpdates = true;
    mysite.RootWeb.AllowUnsafeUpdates = true;

    //根据设定的信息,启动工作流
    mysite.WorkflowManager.StartWorkflow(mylistitem, mywfass, EventData);
    }
    catch{ }

    更新:示例下载 here

  • 相关阅读:
    左耳听风-ARTS-第4周(2019/4/21-2019/4/27)
    Java集合总结
    Zuul网关总结
    左耳听风-ARTS-第3周(2019/4/7-2019/4/13)
    左耳听风-ARTS-第2周(2019/3/31-2019/4/6)
    Java泛型相关总结(下)
    左耳听风-ARTS-第1周
    去长江边走走,看看
    第1记
    c#发送邮件
  • 原文地址:https://www.cnblogs.com/ningang/p/4347488.html
Copyright © 2011-2022 走看看