概要

本文描述了在 InfoPath 2003 表单中动态加载数据的三种方法。您可以使用 OnLoad 事件,自动创建 InfoPath ExternalApplication 对象,或者创建 ASP 页。本文还提供了代码示例。

简介

本文描述如何在 Microsoft Office InfoPath 2003 表单中动态加载数据。

更多信息

InfoPath 表单是 XML 文件。此类文件包含表单中的数据,以及帮助 Microsoft Windows 资源管理器或 Microsoft Internet Explorer 识别这些 XML 数据所属应用程序的 XML 处理指令。

您可以通过使用以下三种方法之一将数据动态加载到 InfoPath 中:
使用 OnLoad 事件。

OnLoad 事件中,您可以调用 ASP 页或其它的外部数据源来检索数据并将其复制到表单中。
自动创建 InfoPathExternalApplication 对象。

此方法将创建一个基于来源于外部的数据的新表单。
注意:要使用此方法,必须将 Internet Explorer 中的“对没有标记为安全的 ActiveX 控件进行初始化和脚本运行”设置设为“提示”或“启用”。
来源于外部的数据也必须是有效的 InfoPath XML。
创建 ASP 页。

ASP 页会以正确的 InfoPath 格式返回 XML 数据,以便作为表单文件打开。这些 XML 数据包含一个引用,该引用指向将在其上显示这些数据的 InfoPath 表单模板。 InfoPath 可以正确地显示数据。

回到顶端

创建新的虚拟目录

1. 启动 Microsoft Internet 信息服务管理器。
2. 展开树视图中的“网站”目录。
3. 右键单击您想要在其中创建新虚拟目录的网站,指向“新建”,然后单击“虚拟目录”。
4. 按照“虚拟目录创建向导”中的步骤创建新的虚拟目录。

注意:您必须将写权限授予虚拟目录。

回到顶端

设计 Microsoft Office InfoPath 2003 表单

1. 启动 InfoPath。在左窗格中,单击“设计表单”。
2. 在“设计表单”下,单击“新建空白表单”。
3. 在“设计任务”下,单击“控件”。
4. 单击“文本框”两次,将两个文本框控件添加到表单中。
5. 在“文件”菜单上,单击“发布”。
6. 在“发布向导”中,单击“下一步”,单击“到 Web 服务器”,然后单击“下一步”。
7. 在“Web URL 和文件名”框中,键入您所创建的虚拟目录的 URL。
8. 在“表单名称”框中,键入 twofield.xsn。
注意:确保 URL 类似于以下形式:http://myServer/myVirtualDirectory/twofield.xsn。
9. 单击“下一步”,单击“完成”,然后单击“关闭”。
10. 退出 InfoPath 2003。

回到顶端

创建 Default.asp 网页

1. 单击“开始”,单击“运行”,键入 notepad,然后单击“确定”。
2. 将下面的代码粘贴到记事本中。
<%@ Language=VBScript %>

<%

dim serverName, hrefPath, fileNamePos, serverPath

serverName = Request.ServerVariables("SERVER_NAME")

hrefPath = Request.ServerVariables("PATH_INFO")

fileNamePos = InStr( 1, hrefPath, "/Default.asp", 1 )

hrefPath = Left(hrefPath, fileNamePos )

serverPath = "http://" + serverName + hrefPath

%>

<HTML>

<head>

<SCRIPT LANGUAGE=VBScript>

Sub ButtonClick()

Dim oInfoPathApp

set oInfoPathApp = CreateObject("InfoPath.ExternalApplication")

oInfoPathApp.New "<%=serverPath%>GetData.asp?dataRequest=2"

set oInfoPathApp = Nothing

window.close

End Sub

</SCRIPT>

</HEAD>

<BODY onload="ButtonClick">

</BODY>

</HTML>
3. 将该文件另存为 Default.asp,保存在“创建新的虚拟目录”一节中创建的虚拟目录中。

回到顶端

创建可以动态生成表单的 ASP 页

1. 查找然后双击您刚刚发布的表单 Twofield.xsn。
注意:此时将打开一个新的空白表单供您填写。
2. 单击“文件”,然后单击“另存为”。
3. 将文件另存为 Form1.xml。
4. 单击“开始”,单击“运行”,键入 notepad,然后单击“确定”。
5. 将下面的代码粘贴到记事本中:
<%@ Language=VBScript %>
<%
' Define the XML namespace for the form.
Dim strNamespace
strNamespace = "http://schemas.microsoft.com/office/infopath/2003/myXSD/2003-04-21T15:25:26"

'Calculate the path of this server directory.
dim serverName, hrefPath, fileNamePos, serverPath
serverName = Request.ServerVariables("SERVER_NAME")
hrefPath = Request.ServerVariables("PATH_INFO")
fileNamePos = InStr( 1, hrefPath, "/GetData.asp", 1 )
hrefPath = Left(hrefPath, fileNamePos )
serverPath = "http://" + serverName + hrefPath

' Set our return content type.
Response.ContentType = "text/xml"

'Create an XML document to return.
Dim oXML
Set oXML = Server.CreateObject("MSXML.DOMDocument")

'Create the XML header that all XML documents must have.
dim myPI1
set myPI1 = oXML.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8""")
oXML.insertBefore myPI1, oXML.childNodes.item(0)

'Create the mso-infopathSolution processing instruction that binds the XML from this page to the
'TwoField.xsn InfoPath form template.
dim myPI2
set myPI2 = oXML.createProcessingInstruction("mso-infoPathSolution", "solutionVersion=""1.0.0.1"" productVersion=""11.0.5531"" PIVersion=""1.0.0.0"" href=""" + serverPath + "TwoField.xsn""")
oXML.insertBefore myPI2, oXML.childNodes.item(1)

'Create the mso-application processing instruction that marks the XML from this page as an InfoPath form.
dim myPI3
set myPI3 = oXML.createProcessingInstruction("mso-application", "progid=""InfoPath.Document""")
oXML.insertBefore myPI3, oXML.childNodes.item(2)

'Generate the XML for the form.
dim myFields
set myFields = oXML.createNode( 1, "myFields", strNamespace )
oXML.appendChild myFields

dim field1
set field1 = oXML.createNode( 1, "field1", strNamespace )

dim field2
set field2 = oXML.createNode( 1, "field2", strNamespace )

dim requestedData
requestedData = Request("dataRequest")
Select Case requestedData
Case "1"
field1.text = "test field 1"
field2.text = "test field 2"
Case "2"
field1.text = "test field 3"
field2.text = "test field 4"
Case "3"
field1.text = "test field 5"
field2.text = "test field 6"
Case Else
field1.text = "test field 7"
field2.text = "test field 8"
end Select

myFields.appendChild field1
myFields.appendChild field2

'Return the XML to the client.
Response.Write oXML.XML
%>
6. 在“文件”菜单上,单击“另存为”,在“文件名”框中键入 GetData.asp,然后单击“保存”。
7. 再启动一个记事本实例。
8. 在“文件”菜单上,单击“打开”,单击“Form1.xml”,然后单击“打开”。
9. 在 Form1.xml 中查找 xmlns:my namespace,然后复制其值。
注意:此值类似于“http://schemas.microsoft.com/office/infopath/2003/myXSD/2003-04-21T15:25:26”。
10. 切换回包含 GetData.asp 的记事本会话,然后在 GetData.asp 中查找下面的行:
strNamespace = "http://schemas.microsoft.com/office/infopath/2003/myXSD/2003-04-21T15:25:26"
11. 用您在步骤 9 中复制的值替换“strNamespace”变量的值。
12. 单击“保存”,然后退出记事本。
13. 将 GetData.asp 复制到 Twofield.xsn 表单模板所在的虚拟目录中。

回到顶端

将代码添加到 InfoPath 表单中,以便从 ASP 页中自动加载数据

1. 启动 InfoPath。
2. 在左窗格中,单击“设计表单”。
3. 在“设计表单”任务窗格中,在“在设计模式中打开表单”下单击“本机上的模板”。
4. 键入您发布的表单模板的 URL。
注意:此 URL 类似于 http://myServer/myVirtualDirectory/twofield.xsn。
5. 在“工具”菜单上,单击“编程”,然后单击“OnLoad 事件”。
6. 用以下代码替换默认的“OnLoad 事件”代码:
function XDocument::OnLoad(eventObj)
{
//Only load data if the fields are empty.
if (XDocument.DOM.selectSingleNode("/my:myFields/my:field1").text == "" )
{
//Work out the location of the data file based on the current install directory.
searchExpression = new RegExp( "TwoField.xsn", "ig" );
searchResults = XDocument.Solution.URI.match( searchExpression );
if (searchResults.length == 0)
return;

//Clear the "TwoField.xsn" part of the string.
var targetDirectory = XDocument.Solution.URI.slice(0, searchResults.index );

//Load the example data into and XML document.
var objExternalData = new ActiveXObject("MSXML2.DomDocument.5.0");
objExternalData.async = false;
objExternalData.validateOnParse = false;
objExternalData.load( targetDirectory + "getData.asp?dataRequest=3" );

//Set the SelectionNamespaces property so that we can search the example data.
var strSelectionNamespaces = XDocument.DOM.getProperty("SelectionNamespaces");
objExternalData.setProperty("SelectionNamespaces", strSelectionNamespaces );

//Find the root node in the example data and import it into the InfoPath document.
var objExternalXML = objExternalData.selectSingleNode("my:myFields");
var objReplacementXML = XDocument.DOM.importNode( objExternalXML, true );

//Find the original data in the form and replace it with the example data.
var objOriginalXML = XDocument.DOM.selectSingleNode("my:myFields");
XDocument.DOM.replaceChild( objReplacementXML, objOriginalXML );
}
}
7. 在“文件”菜单上,单击“保存”,然后关闭 InfoPath 2003 表单。

回到顶端

测试 InfoPath 表单

通过使用 OnLoad 事件

加载数据 如果表单中没有其他数据,则 TwoField.xsn 表单 OnLoad 事件将从 GetData.asp 页面中加载数据。要加载这些数据,请按照下列步骤操作:
1. 依次单击“开始”和“运行”,键入表单路径,然后单击“确定”。键入的路径类似于以下网址:
http://myServer/IPDynamicData/TwoField.xsn
2. 按照提示,单击“打开”。
注意,InfoPath 将启动,并且 TwoField.xsn 表单将打开。Field1 包含“test field 5”,Field2 包含“test field 6”。在将其 dataRequest 参数设置为“3”时,GetData.asp 就会返回这些值。

通过使用 ExternalApplication.New 加载默认表单

Default.asp 页会创建客户端脚本来自动生成 ExternalApplication 对象,以便启动 InfoPath 并创建一个新表单。新表单基于由 GetData.asp 返回的 XML 数据。要创建新表单,依次单击“开始”、“运行”,键入 Default.asp 页面的路径,然后单击“确定”。键入的路径类似于以下网址:
http://myServer/IPDynamicData/default.asp


注意:要使用此方法,必须在 Internet Explorer 中单击“对没有标记为安全的 ActiveX 控件进行初始化和脚本运行”设置的 “提示”或“启用”。

注意,InfoPath 将启动,并且 TwoField.xsn 表单将打开。Field1 包含“test field 3”,Field2 包含“test field 4”。在将其 dataRequest 参数设置为“2”时,GetData.asp 就会返回这些值。

加载 ASP 页中现有的表单

GetData.asp 页会以正确的格式返回 XML,以便 InfoPath 将其作为表单文件打开。为此,请依次单击“开始”、“运行”,键入 GetData.asp 的路径,然后单击“确定”。键入的路径类似于以下网址:
http://myServer/IPDynamicData/getData.asp?dataRequest=1
注意,InfoPath 将启动,并且 GetData.asp 将打开。Field1 包含“test field 1”, Field2 包含“test field 2”。在将其 dataRequest 参数设置为“1”时,GetData.asp 就会返回这些值。

Microsoft 提供的编程示例只用于说明目的,不附带任何明示或默示的保证。这包括但不限于对适销性或特定用途适用性的默示保证。本文假定您熟悉所演示的编程语言和用于 创建和调试过程的工具。Microsoft 的支持工程师可以帮助解释某个特定过程的功能,但是他们不会修改这些示例以提供额外的功能或构建过程以满足您的特殊需求。

回到顶端


这篇文章中的信息适用于:
Microsoft Office InfoPath 2003
Microsoft Office InfoPath 2003, Service Pack 1 (SP1)

回到顶端


Microsoft 和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何 责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与 该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、

posted on 2007-05-30 10:22  Dragon-China  阅读(939)  评论(0编辑  收藏  举报