InfoPath是微软Office套件中的一个组件,它允许用户创建和填写电子表单。本文将介绍如何使用代码创建InfoPath表单,生成类表示,上传表单模板到SharePoint,并填充数据。
首先,使用MicrosoftInfoPath设计器创建一个InfoPath表单。这个示例表单将存储客户的姓名和姓氏,以及一个产品和数量的表格。
保存InfoPath表单:
使用Visual Studio命令提示符加载源文件,并执行命令:
xsd.exe /c /l:CS myschema.xsd
XSD工具是.NET框架工具的一部分。将使用它从InfoPath表单的XSD文件表示生成一个通用语言类。
以下代码由xsd自动生成:
[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表单站点。
使用XSD应用程序创建的类填充myFields类。
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;
MemoryStream myInStream = new MemoryStream();
string rFormSite = @"http://sp/Sample Form";
string rTemplateLocation = @"http://sp/Sample Form/Forms/template.xsn";
using (myInStream)
{
XmlSerializer serializer = new XmlSerializer(typeof(myFields));
XmlTextWriter writer = new XmlTextWriter(myInStream, Encoding.UTF8);
string rInstruction = "name=\"urn:schemas-microsoft-com:office:infopath:UploadSample:-myXSD-2009-02-04T09-20-42\" solutionVersion=\"1.0.0.2\" productVersion=\"12.0.0.0\" PIVersion=\"1.0.0.0\" href=\"" + rTemplateLocation + "\"";
writer.WriteProcessingInstruction("mso-infoPathSolution", rInstruction);
writer.WriteProcessingInstruction("mso-application", "progid=\"InfoPath.Document\" versionProgid=\"InfoPath.Document.2\"");
serializer.Serialize(writer, fields);
using (SPSite site = new SPSite(rFormSite))
{
using (SPWeb spweb = site.OpenWeb())
{
spweb.Files.Add(rFormSite + "\\" + Path.GetRandomFileName() + ".xml", myInStream.GetBuffer());
}
}
}