8.3 InfoPath表单容器XmlFormView
8.3.1 XmlFormView表单容器简介
OSS 2007默认的表单呈现页面是FormServer.aspx页面,它位于layouts目录下。我们用文本编辑器打开这个文件,可以发现其实这个页面包含的就是一个XmlFormView控件。XmlFormView是一个InfoPath表单容器控件。当我们要在自定义页面中嵌入InfoPath表单的时候需要用到该控件。该控件属于Microsoft.Office.InfoPath.Server.Controls名称空间,其所在的程序集Microsoft.Office.InfoPath.Server.dll可以在安装了InfoPath Froms Servcies的服务器的C:\Program Files\Microsoft Office Servers\12.0\Bin目录下找到。
XMLFormView不仅仅是一个普通的ASP.NET 2.0的Web控件,它同时还继承自System.Web.UI.WebControls.WebParts.WebPart类,是一个ASP.NET 2.0的Web Part。所以在MOSS中注册一下XmlFormView Web Part,就可以在MOSS的Web部件页中直接使用它。接下来我们将分别介绍XmlFormView作为Web Part和普通Web控件的使用方法。
8.3.2 XmlFormView Web Part的使用
在使用XmlFormView Web Part之前,我们首先要部署这个Web Part。因为InfoPath Forms Services是部署在前端服务器上的一个服务器场层次的服务,所有Web应用程序都可以访问,所以我们把这个Web Part直接部署在GAC中方便让所有网站都可以使用这个Web Part。(当然单独部署某个Web应用程序IIS对应目录的bin目录也是可以的,这里不做介绍)。
首先,我们在前面提到的路径中找到Microsoft.Office.InfoPath.Server.dll,把它拖到GAC(通常是C:\WINDOWS\assembly)中(见图8-40)。

图8-40
接着,在Web应用程序对应的IIS目录下的Web.config文件的SafeControls节中加入:
<SafeControl Assembly="Microsoft.Office.InfoPath.Server, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" Namespace="Microsoft.Office.InfoPath.Server.Controls" TypeName= "XmlFormView" Safe="True" />注册XmlFormView Web Part。
然后,到网站集的Web部件库页面,点击工具栏的“新建”进入新建Web部件页面,选择导入Microsoft.Office.InfoPath.Server.Controls.XmlFormView部件之后,即可使用。
一个Web部件也只能包含一个XmlFormView Web Part,该Web Part包含以下自定义属性(见表8-1)。
表8-1
|
类别 |
属性 |
说明 |
|
功能 |
ShowHeader |
是否显示XmlFormView的顶部工具条 |
|
ShowFooter |
是否显示XmlFormView的底部工具条 |
|
|
EditingStatus |
设置编辑状态,包括Init、Closed、Editing 3个选项 |
|
|
Options |
可设置参数,支持DisableSave参数设置,设置是否显示保存按钮 |
|
|
数据绑定 |
XsnLocation |
表单模板所在的地址 形如:http://localhost/DocLib1/Forms/template.xsn |
|
XmlLocation |
要装载的表单文件的地址 形如:http://localhost/DocLib1 |
|
|
SaveLocation |
填写的表单XML文件的存储地址 形如:http:// localhost /DocLib1/test.xml |
在页面上放置一个XmlFormView Web Part载入的表单可以和Web部件页很好地整合在一起(见图8-41)。

图8-41
8.3.3 XmlFormView控件实战:在自定义Web页面中嵌入InfoPath表单
XmlFormView控件的使用方法和一般的ASP.NET 2.0的控件一样。XmlFormView的主要属性和事件如表8-2所示。
表8-2
|
属性 |
|
|
EditingStatus |
设置控件显示表单的方式,有3种方式可选。 Init:表单不显示 Editing:表单显示,并可以使用 Closed:表单关闭,显示给用户“表单已关闭”提示信息 |
|
Options |
参数,支持设置DisableSave,设置保存按钮可见性 |
|
ShowHeader |
控件上端工具条显示状态 |
|
ShowFooter |
控件底部工具条显示状态 |
|
SaveLocation |
保存表单文件的地址 |
|
XmlLocation |
载入的表单文件的地址 |
|
XsnLocation |
表单模板的地址 |
|
XmlForm |
代表当前表单的数据。在XmlFormView中,我们可以和控件装载的表单进行数据交互,利用它的事件我们可以把页面Url的参数或者自定义页面控件的值传递给表单,也可以把表单内的值取出来传递给页面其他控件。但只有在XmlFormView的以下事件中才能访问XmlForm属性:Initialize、NotifyHost、SubmitToHost和Close |
|
事件 |
|
|
Close |
表单关闭事件 |
|
Initialize |
表单初始化事件 |
|
NotifyHost |
表单向宿主环境进行数据交互的事件,一般是在表单中的按钮调用NotifyHost方法的时候会触发该事件 |
|
SubmitToHost |
向宿主环境提交表单的事件 |
更多信息可访问:http://msdn2.microsoft.com/en-us/library/ms772268.aspx
接下来,我们将进行XmlFormView的实战部分,在实际的示例中介绍这个控件的使用方法。实战示例的表单模板将在前面用到的“员工信息”搜集表单模板的基础上,添加一个“提交”按钮,用以把填写好的表单数据提交到文档库中。我们在设计模式下打开“员工信息”表单模板,添加一个按钮,双击显示按钮属性,在属性页中,把操作设置为“提交”。点击“提交选项”,在提交选项设置窗口中,选择将表单提交到“SharePoint文档库”。再点“添加”按钮,添加一个提交连接(见图8-42)。

图8-42
设置提交连接的时候,提交文档地址库设置为http://localhost/DocLib1(一个名为“员工信息”的文档库),默认存储的文件名使用表单中的Name域值,并设置覆盖已存在的文档(见图8-43)。

图8-43
根据以上步骤添加完“提交”按钮以后,把表单发布到MOSS网站中,最后我们得到了表单模板相关的几个地址:
表单模板地址(XsnLocation):http://localhost/DocLib1/Forms/template.xsn
表单文件存储位置(SaveLocation):http://localhost/DocLib1/
表单文件地址(XmlLocation):http://localhost/DocLib1/[Name].xml
在实战中,我们要实现的自定义页面效果如图8-44所示。

图8-44
该Web程序从文档库中取出已有的所有员工信息,加载到所有员工列表中。点击某个员工,在右边的XmlFormView中加载员工详细信息。点击“新建员工信息”,把XmlFormView中信息清空。点击“提交”,把增加的员工信息提交到文档库。“刷新”按钮重新加载员工列表。
(1)在Visual Studio新建一个WebSite,名称“XmlFormView”,添加对Microsof.SharePoint.dll和Microsoft.Office.InfoPath.Server.dll的引用,设计如图8-45所示界面。并设置XmlFormView控件的EditingStatus为Editing,ShowFooter和ShowHeader均设置为False。

图8-45
Visual Studio要安装在InfoPath Forms Services所在的机器上。XmlFormView控件如果没有出现在工具箱中,可以在工具箱窗格上右键选择“选择项”,弹出“选择工具箱项”窗口(见图8-46)。

图8-46
如果在该窗口种仍未找到,则单击“浏览”定位到C:\Program Files\Microsoft Office Servers\12.0\Bin\Microsoft.Office.InfoPath.Server.dll,加载进来即可。
(2)给设计的界面编写响应代码
新建一个刷新员工列表lbstuffs(ListBox)的函数:
private void RefreshList()
{
lbstuffs.Items.Clear();
SPSite mysite = new SPSite("http://localhost");
SPWeb myweb = mysite.RootWeb;
SPList StuffList = myweb.Lists["员工信息"];
foreach (SPListItem StuffItem in StuffList.Items)
{
lbstuffs.Items.Add(new ListItem(StuffItem.Title, StuffItem.Url));
}
lbstuffs.SelectedIndex = 0;
}
给Page_Load添加如下代码:
if (!Page.IsPostBack)
{
RefreshList();
}
给butnew_Click添加如下相应代码:
//XFVInfo为添加的XmlFormView的ID
//清空载入的表单文件
XFVInfo.XmlLocation = "";
//设置加载的表单模板
XFVInfo.XsnLocation = "http://localhost/DocLib1/Forms/template.xsn";
给lbstuffs_SelectedIndexChanged添加如下代码:
//设置加载的表单文件为选中的员工对应的信息xml文件
XFVInfo.XsnLocation = "";
XFVInfo.XmlLocation = "http://localhost/" + lbstuffs.SelectedItem.Value;
给butrefresh_Click添加如下代码:
RefreshList();
(3)在http://localhost网站对应的Web应用程序对应的IIS目录下,本例中为C:\Inetpub\wwwroot\wss\VirtualDirectories\80,新建一个文件夹XmlFormView,打开IIS管理器(见图8-47)。

图8-47
右键单击XmlFormView,选择“属性”,弹出属性窗口(见图8-48)。

图8-48
创建应用程序,选择与所在的Web应用程序相同的应用程序池。
(4)返回Visual Studio,选择“生成”菜单的“发布网站”菜单项(见图8-49)。

图8-49
选择发布到C:\Inetpub\wwwroot\wss\VirtualDirectories\80\XmlFormView目录下,点击“确定”按钮。
(5)发布完成,打开浏览器,访问http://localhost/XmlFormView/default.aspx(见图8-50)。

图8-50
现在,我们就在一个普通的ASP.NET页面中,放入一个使用InfoPath Forms Services生成的HTML格式的电子表单。






