在infopath模板自身的脚本编辑器里用js写业务代码有一年了,代码的难度一般,就是使用一些对象对XML结点进行增,删,修,查,复制,装载,翻译等操作,主要还是利用js语法和业务逻辑编程。
XDocument,UI,View,selectSingleNode,selectNodes,appendChild,replaceChild
removeChild,removeAll,cloneNode,nextSibling,transformNode,loadXML……
有时执行js代码时感觉效率不高,于是用net 2003结合IPVSPROJ2003.exe,在net中建模板,C#作为托管语言。感觉不错,好多方法和属性在打点后会自动出来,快……。调试也容易。
下面是我写的一段,输出webservice拉过来的产品数据:
using System;
using info = Microsoft.Office.Interop.InfoPath.SemiTrust;
using Microsoft.Office.Interop.InfoPath.SemiTrust;
// Office 集成属性,指明表单的 startup 类。不要修改。
[assembly: System.ComponentModel.DescriptionAttribute("InfoPathStartupClass, Version=1.0, Class=InfoPathProject1.InfoPathProject1")]
namespace InfoPathProject1
{
// 属性中定义的命名空间前缀必须与表单定义文件(.xsf)中的同步。
[InfoPathNamespace("xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:xdUtil=\"http://schemas.microsoft.com/office/infopath/2003/xslt/Util\" xmlns:ns4=\"http://schemas.microsoft.com/office/infopath/2003/myXSD/2006-08-12T00:41:12\" xmlns:xdXDocument=\"http://schemas.microsoft.com/office/infopath/2003/xslt/xDocument\" xmlns:tm=\"http://microsoft.com/wsdl/mime/textMatching/\" xmlns:xhtml=\"http://www.w3.org/1999/xhtml\" xmlns:dfs=\"http://schemas.microsoft.com/office/infopath/2003/dataFormSolution\" xmlns:xd=\"http://schemas.microsoft.com/office/infopath/2003\" xmlns:ns7=\"http://schemas.xmlsoap.org/wsdl/soap/\" xmlns:tns=\"http://tempuri.org/\" xmlns:msxsl=\"urn:schemas-microsoft-com:xslt\" xmlns:soap12=\"http://schemas.xmlsoap.org/wsdl/soap12/\" xmlns:ns3=\"http://schemas.microsoft.com/office/infopath/2003/myXSD\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:http=\"http://schemas.xmlsoap.org/wsdl/http/\" xmlns:ns6=\"http://schemas.microsoft.com/office/infopath/2003/myXSD/2006-05-23T07:44:28\" xmlns:ns5=\"http://schemas.microsoft.com/office/infopath/2003/myXSD/2006-08-14T01:23:01\" xmlns:xdMath=\"http://schemas.microsoft.com/office/infopath/2003/xslt/Math\" xmlns:xsf=\"http://schemas.microsoft.com/office/infopath/2003/solutionDefinition\" xmlns:mime=\"http://schemas.xmlsoap.org/wsdl/mime/\" xmlns:ns2=\"http://schemas.microsoft.com/office/infopath/2003/myXSD/2006-05-30T00:40:51\" xmlns:my=\"http://schemas.microsoft.com/office/infopath/2003/myXSD/2008-02-19T08-13-12\" xmlns:ns1=\"http://schemas.microsoft.com/office/infopath/2003/myXSD/2006-07-20T06:01:42\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\" xmlns:tr=\"http://schemas.microsoft.com/office/infopath/2003/sample/TravelRequest\" xmlns:xdDate=\"http://schemas.microsoft.com/office/infopath/2003/xslt/Date\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"")]
public class InfoPathProject1
{
private info.XDocument XD;
private info.Application thisApplication;
public void _Startup(Application app, XDocument doc)
{
XD = doc;
thisApplication = app;
// 您可以在此添加其他初始化代码。
}
public void _Shutdown()
{
}
// 下列函数处理程序由 Microsoft Office InfoPath 创建。不要修改类型或参数数目。
[InfoPathEventHandler(MatchPath="CTRL8_5", EventType=InfoPathEventType.OnClick)]
public void CTRL8_5_OnClick(DocActionEvent e)
{
// 行数
string hang = XD.DOM.selectSingleNode("//my:产品个数").text;
// 初始重复表行数
info.IXMLDOMNode curNode = XD.DOM.selectSingleNode("//my:产品列表");
info.IXMLDOMNode curNextNode = curNode.nextSibling;
while(curNextNode != null)
{
curNode.parentNode.removeChild(curNextNode);
curNextNode = curNode.nextSibling;
}
//XD.DOM.selectSingleNode("//my:field1").text = XD.GetDOM("aj_商品类型").xml;
// 数据
info.IXMLDOMDocument2 dataDOM;
dataDOM = (info.IXMLDOMDocument2)XD.GetDOM("aj_商品类型");
dataDOM.setProperty("SelectionNamespaces","xmlns:my=\"http://schemas.microsoft.com/office/infopath/2003/myXSD/2006-05-23T07:44:28\"");
info.IXMLDOMNodeList dataNodeList = dataDOM.selectNodes("//my:设备型号管理[position()<=" + hang + "]");
for(int i=0;i<dataNodeList.length;i++)
{
info.IXMLDOMNode tempNode = curNode.cloneNode(true);
tempNode.selectSingleNode("my:大类").text = dataNodeList[i].selectSingleNode("my:分类").text;
tempNode.selectSingleNode("my:小类").text = dataNodeList[i].selectSingleNode("my:小类").text;
tempNode.selectSingleNode("my:名称").text = dataNodeList[i].selectSingleNode("my:名称").text;
tempNode.selectSingleNode("my:型号").text = dataNodeList[i].selectSingleNode("my:型号").text;
curNode.parentNode.appendChild(tempNode);
}
}
}
}