以编程方式编辑Infopath表单字段?

时间:2009-12-28 10:16:49

标签: sharepoint moss infopath

我的共享点网站上有一个表单库。以编程方式我需要填写一些字段。我能这样做吗?如果有人知道请提供一些示例代码。首先,我需要检索infopath文档,然后我需要填写字段。

5 个答案:

答案 0 :(得分:5)

发布的axel_c非常接近。这是一些经过清理和验证的工作代码...

public static void ChangeFields()
{
    //Open SharePoint site
    using (SPSite site = new SPSite("http://<SharePoint_Site_URL>"))
    {
        using (SPWeb web = site.OpenWeb())
        {
            //Get handle for forms library
            SPList formsLib = web.Lists["FormsLib"];

            if (formsLib != null)
            {
                foreach (SPListItem item in formsLib.Items)
                {
                    XmlDocument xml = new XmlDocument();

                    //Open XML file and load it into XML document
                    using (Stream s = item.File.OpenBinaryStream())
                    {
                        xml.Load(s);
                    }

                    //Do your stuff with xml here. This is just an example of setting a boolean field to false.
                    XmlNodeList nodes = xml.GetElementsByTagName("my:SomeBooleanField");
                    foreach (XmlNode node in nodes)
                    {
                        node.InnerText = "0";
                    }

                    //Get binary data for new XML
                    byte[] xmlData = System.Text.Encoding.UTF8.GetBytes(xml.OuterXml);

                    using (MemoryStream ms = new MemoryStream(xmlData))
                    {
                        //Write data to SharePoint XML file
                        item.File.SaveBinary(ms);
                    }
                }
            }
        }
    }
}

答案 1 :(得分:0)

Infopath文档只是一个常规XML文件,其结构与您在Infopath表单中定义的数据源相匹配。

您只需要通过SharePoint对象模型访问该文件,使用标准方法(XmlDocument API)对其进行修改,然后将其写回SharePoint列表。您必须小心保留结构并插入有效数据,否则您将无法使用Infopath打开表单。

如果您计划进行任何认真的开发,您应该查看一本关于SharePoint的书。 Infopath也是一个雷区。

对象模型用法示例:hereherehere。可疑的MSDN参考文档非常不完整here

编辑:这是一些示例代码。我还没有完成SharePoint一段时间,所以我不确定这是100%正确,但它应该足以让你开始:

// Open SharePoint site
using (SPSite site = new SPSite("http://<SharePoint_Site_URL>"))
{
  using (SPWeb web = site.OpenWeb())
  {
    // Get handle for forms library
    SPList formsLib = web.Lists["FormsLib"];
    if (formsLib != null)
    {
      SPListItem itm = formsLib.Items["myform.xml"];

      // Open xml and load it into XML document
      using (Stream s = itm.File.OpenBinary ())
      {
          MemoryStream ms;
          byte[] xmlData;


          XmlDocument xml = new XmlDocument ();
          xml.Load (s);
          s.Close ();  

        // Do your stuff with xml here ...

        // Get binary data for new XML
        xmlData = System.Text.Encoding.UTF8.GetBytes (xml.DocumentElement.OuterXml);

        ms = new MemoryStream (xmlData); 

        // Write data to sharepoint item
        itm.File.SaveBinary (ms);

        ms.Close ();

        itm.Update ();  
      }


    }
    web.Close();
  }
  site.Close();
}

答案 2 :(得分:0)

这取决于您可用的工具集,技能和确切要求。

在InfoPath表单中预填充数据有两种主要方式。

  1. 将相关字段导出为表单发布过程的一部分。然后,这些字段将成为文档/表单库中的列,您可以通过工作流或自定义代码所在的位置手动操作它们。

  2. 使用类似于之前Axel_c提供的代码直接操作表单。这里最大的问题是:什么会触发这段代码?文档库中的事件接收器,SharePoint Designer工作流,Visual Studio工作流等?

  3. 如果您尝试从SharePoint Designer工作流程执行此操作,请查看Workflow Power Pack for SharePoint。它允许将C#和VB代码直接嵌入到工作流中,而无需复杂的Visual Studio开发。有关如何从工作流can be found here查询InfoPath数据的示例。如果你有一些开发技巧,你应该能够修改它以满足你的需求。

    我还推荐网站www.infopathdev.com,他们有优秀且活跃的论坛。你几乎肯定会在那里找到你的问题的答案。

答案 3 :(得分:0)

感谢您提供示例代码@axel_c和@Jeff Burt

以下是Jeff Burt为我需要的文档集中的文件修改的相同代码。如果您还没有文档集参考,可以查看此站点如何获取一个: http://howtosharepoint.blogspot.com/2010/12/programmatically-create-document-set.html

此外,代码将打开infopath表单的.xml版本,而不是您可能遇到的.xsn模板版本。

再次感谢所有人......

    private void ChangeFields(DocumentSet docSet)
    {

        string extension = "";
        SPFolder documentsetFolder = docSet.Folder;


        foreach (SPFile file in documentsetFolder.Files)
        {

            extension = Path.GetExtension(file.Name);

            if (extension != ".xml") //check if it's a valid xml file
                return;

            XmlDocument xml = new XmlDocument();


            //Open XML file and load it into XML document, needs to be .xml file not .xsn
            using (Stream s = file.OpenBinaryStream())
            {
                xml.Load(s);
            }

            //Do your stuff with xml here. This is just an example of setting a boolean field to false.
            XmlNodeList nodes = xml.GetElementsByTagName("my:fieldtagname");
            foreach (XmlNode node in nodes)
            {
                node.InnerText = "xyz";
            }

            //Get binary data for new XML
            byte[] xmlData = System.Text.Encoding.UTF8.GetBytes(xml.OuterXml);

            using (MemoryStream ms = new MemoryStream(xmlData))
            {
                //Write data to SharePoint XML file
                file.SaveBinary(ms);
            }
        }



    }

答案 4 :(得分:0)

我遇到了这个问题并在Jeff Burt / Axel_c的帖子的帮助下解决了这个问题。

我试图使用XMLDocument.Save([stream])和SPItem.File.SaveBinary([stream])方法将更新的InfoPath XML文件写回SharePoint库。似乎XMLDocument.Save([stream])使用错误的编码将文件写回SharePoint,无论XML声明中的内容如何。

尝试打开更新的InfoPath表单时,我不断收到错误“表单中的计算尚未完成......”

我已经编写了这两个函数来获取和更新InfoPath表单。只需以通常的方式操作从ReadSPFiletoXMLdocument()返回的XML,然后使用WriteXMLtoSPFile()将其发送回服务器。

private System.Xml.XmlDocument ReadSPFiletoXMLdocument(SPListItem item)
{
    //get SharePoint file XML
    System.Xml.XmlDocument xDoc = new System.Xml.XmlDocument();
    try
    {
        using (System.IO.Stream xmlStream = item.File.OpenBinaryStream())
        {
            xDoc.Load(xmlStream);
        }
    }
    catch (Exception ex)
    {
        //put your own error handling here
    }
    return xDoc;
}

private void WriteXMLtoSPFile(SPListItem item, XmlDocument xDoc)
{
    byte[] xmlData = System.Text.Encoding.UTF8.GetBytes(xDoc.OuterXml);
    try
    {
        using (System.IO.MemoryStream outStream = new System.IO.MemoryStream(xmlData))
        {
            item.File.SaveBinary(outStream);
        }
    }
    catch (Exception ex)
    {
       //put your own error handling here
    }
}