65.9K
CodeProject 正在变化。 阅读更多。
Home

以编程方式创建浏览器启用的 InfoPath 表单

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (5投票s)

2009年2月12日

CPOL

1分钟阅读

viewsIcon

95855

如何通过编程方式创建浏览器启用的 InfoPath 表单。

引言

本文概述了使用代码创建、填充和上传 InfoPath 表单所需的步骤和代码。

设计 InfoPath 表单

使用 Microsoft InfoPath 设计器创建一个 InfoPath 表单。此示例表单将存储客户的姓名和姓氏,以及产品和金额的表格。

Image1.jpg

创建 InfoPath 表单的类表示

  1. 保存 InfoPath 表单
  2. Image2.jpg

    图 2 - 另存为源文件
  3. 加载 Visual Studio 命令提示符
  4. Image3.jpg

  5. 定位源文件
  6. Image4.jpg

  7. 执行命令 xsd.exe /c /l:CS myschema.xsd
  8. XSD 工具是 .NET Framework 工具的一部分。我们将使用它从 InfoPath 表单的 XSD 文件表示形式生成通用语言类。

    Image5.jpg

    图 5 – 生成的 myschema 类
// 
// This source code was auto-generated by xsd, Version=2.0.50727.1432.
// 
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.1432")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true,
 Namespace="http://schemas.microsoft.com/office/infopath/2003/myXSD/2009-02-04T09:20:42")]
[System.Xml.Serialization.XmlRootAttribute(
  Namespace="http://schemas.microsoft.com/office/infopath/2003/myXSD/2009-02-04T09:20:42",
  IsNullable=false)]
public partial class myFields {
private string nameField;
private string surnameField;
private ProductRow[] productTableField;
private System.Xml.XmlAttribute[] anyAttrField;.....
.....
.....

一旦文件在项目中可用,您就有能力将数据源绑定到 .NET 类,并以标准化的格式访问数据。如果您对 InfoPath 数据源进行任何更改,则需要重新运行 xsd.exe 命令,针对新的“schema.xsd”文件。

将表单模板上传到 SharePoint 表单站点

Image6.jpg

图 6 – 发布

Image7.jpg

图 7

Image8.jpg

图 8 – 选择 SharePoint Server

Image9.jpg

图 9

Image10.jpg

图 10

Image11.jpg

图 11

Image12.jpg

图 12

Image13.jpg

图 13

填充并上传表单数据

使用虚拟数据填充 myFields 类。该类是使用 XSD 应用程序创建的。

// Populate myfields class with dummy data. The class was created using the xsd
// application.
myFields fields = new myFields();
fields.Name = "Joe";
fields.Surname = "Blogs";
ProductRow[] rows = new ProductRow[2];
rows[0] = new ProductRow();
rows[0].ProductAmount = "1";
rows[0].ProductName = "Peach Jam";
rows[1] = new ProductRow();
rows[1].ProductAmount = "2";
rows[1].ProductName = "Strawberry Jam";
fields.ProductTable = rows;
// Create infopath form
MemoryStream myInStream = new MemoryStream();
// Form site used to store the generated forms
string rFormSite = @"http://sp/Sample Form";
// Location where form template is stored.
string rTemplateLocation = @"http://sp/Sample Form/Forms/template.xsn"; 
using (myInStream)
{
    // InfoPath forms are XML files. We have to write code to programmatically
    // generate the XML of the InfoPath form
    //Create XmlSerializer using myfields type
    XmlSerializer serializer = new XmlSerializer(typeof(myFields));
    XmlTextWriter writer = new XmlTextWriter(myInStream, Encoding.UTF8);
    // Insert infopath processing instructions
    string rInstruction = 
      "name=\"urn:schemas-microsoft-com:office:infopath:" + 
      "UploadSample:-myXSD-2009-02-04T09-20-42\"";
    rInstruction += 
        "solutionVersion=\"1.0.0.2\" productVersion=\"12.0.0.0\"
        PIVersion=\"1.0.0.0\" href=\"" + rTemplateLocation + "\"";
    // An important thing you need to make sure of is that the href attribute
    // in the mso-infoPathSolution processing instruction points to the correct
    // form template you published. 
    writer.WriteProcessingInstruction("mso-infoPathSolution", rInstruction);
    // Mark the xml as an infopath document. 
    writer.WriteProcessingInstruction("mso-application",
        "progid=\"InfoPath.Document\" versionProgid=\"InfoPath.Document.2\"");
    // Serialize infopath data
    serializer.Serialize(writer, fields);
    // Upload form to form site.
    using (SPSite site = new SPSite(rFormSite))
    {
        // Create web instance.
        using (SPWeb spweb = site.OpenWeb())
        {
            // Add the file to the web file list.
            spweb.Files.Add(rFormSite + "\\" + Path.GetRandomFileName() + ".xml",
                myInStream.GetBuffer());
        }
    }                             
}

结果

Image14.jpg

图 14 – 表单库中的新项目

Image15.jpg

图 15 – 带有数据的表单加载
© . All rights reserved.