总结了下,有如下3种方式可实现代码对表单内容的访问:
1. 提升表单模板属性
2. 通过XmlDocument 对象对表单文件操作
3. 反序列化表单数据架构
接下来,分别简单谈谈这3种方法的简单实现步骤
第一种方式: 提升表单模板属性表单操作:
在设计完表单模板,执行发布向导的过程中,发布希望通过代码访问的表单字段,且勾允许用户编辑
访问代码:
首先是获取当前List Item ,SPListItem item=infopath项,如
SPListItem item= workflowProperties.
Item; item ["WorkflowStatus"] = value;
item.Update();
这种方式很简单,但是由于允许用户编辑,安全性不好。对一些敏感的数据,不建议用这方法。
第二种方式: 通过XmlDocument 对象对表单文件操作
Infopath 是以xml格式保存数据的,因此我们可以通过XML接口访问表单数据
SPFile myfile = item.File;
Stream stream = new MemoryStream(myfile.OpenBinary());
XmlTextReader reader = new XmlTextReader(stream);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(reader);
接下来就可以对xml进行分析了。
第三种方式: 反序列化表单数据架构
Infopath 表单模板文件.xsn 是一个压缩包,文件解压开后,里面有个描述表单数据架构的.xsd文件,然后通过.Net Framework的xsd.exe命令行工具,通过这个.xsd文件得到一个proxy类,然后在项目中使用这个类
比如在一个工作流的初始化窗体Init.xsn
/反序列化workflowProperties.InitiationData以得到初始窗体的实例
XmlSerializer xs = new XmlSerializer(typeof(Init));
XmlTextReader xtr = new XmlTextReader(new System.IO.StringReader(workflowProperties.InitiationData));
Init init = (Init)xs.Deserialize(xtr);
//InfoPath表单的内容反序列化成了一个对象init,然后直接访问这个对象的属性就行了
String s=init.comments;