posts - 11,  comments - 64,  trackbacks - 2

kaneboy@Beijing 说:
《InfoPath 与 Forms Services 开发》
泉州㊣蓝小小(赏梅斋-IT红楼梦:mgroup24599@hotmail.com) 说:
今年。
大连㊣Thunder.Sun 说:
都停
changxuemei 说:
在sharepoint中 我可以把web part page移到另外一个站点吗
济南㊣Starfish 说:
都别说啦~~~~
大连㊣Thunder.Sun 说:
现在听涂总说话
kaneboy@Beijing 说:
嗯,今年。
InfoPath是什么我就不需要解释了吧。
北京㊣BerrySweet 说:
1月1号?
changxuemei 说:
帮帮忙啊
上海㊣Jove 说:
嘘。。。
changxuemei 说:
有哪位大侠知道啊
kaneboy@Beijing 说:
它是Office Client套件中的一个,是一个很强的表单设计器。
kaneboy@Beijing 说:
InfoPath 2007是它的第二个版本。
changxuemei 说:

kaneboy@Beijing 说:
先讲一下整个电子表单解决方案的全局...
kaneboy@Beijing 说:
微软的电子表单解决方案,分成两个部分:
客户端:InfoPath
服务器端:SharePoint Forms Services
kaneboy@Beijing 说:
SharePoint Forms Services是MOSS 2007企业版中的一个组件
kaneboy@Beijing 说:
客户端的InfoPath是一个表单设计器+表单填写器。表单设计者可以使用InfoPath进行表单的设计。
kaneboy@Beijing 说:
然后,将表单发布到一个地方,比如SharePont Forms Services。
kaneboy@Beijing 说:
用户连接到SharePoint上,就可以填写表单了。
kaneboy@Beijing 说:
SharePoint在这个里面的作用是:
1、管理表单模板
2、提供一个“表单库”,作为表单的存储容器
3、能够将表单模板,render成一个html+js的页面,让用户通过浏览器直接填写
北京㊣Angela 说:
想在列表的新建页面添加输入值的判断,当焦点离开时执行,如何处理?
kaneboy@Beijing 说:
先重点讲讲InfoPath客户端
kaneboy@Beijing 说:
其实,InfoPath比大部分的想象,要强得多
kaneboy@Beijing 说:
比大部分人的想象,要强得多
kaneboy@Beijing 说:
首先,它是一个WYSIWYG的设计器,拖拖拽拽,就可以完成表单的设计
kaneboy@Beijing 说:
相信大家都用过了
kaneboy@Beijing 说:
然后,它内置了表单数据的验证、规则的能力
kaneboy@Beijing 说:
验证:当用户填写了表单数据时,验证是否符合我们的要求,比如,“必须填入一个大于0的数字”,就是一种验证
kaneboy@Beijing 说:
规则:当用户填写了一项数据后,执行一些特定的操作,比如“用户选择了部门后,将选中的部门名称自动填入到下方的文本框中”
kaneboy@Beijing 说:
大家在设计表单时,一定感觉很亲切,因为和VS的WinForms设计器非常相似,但是,不要被这个表面所迷惑了...
kaneboy@Beijing 说:
因为,在InfoPath开发里面,是没有“控件”这样的概念的
kaneboy@Beijing 说:
每个表单模板,它都由几个重要的部分组成,其中最重要的部分,就是一个XML Schema
kaneboy@Beijing 说:
这个XML Schema,也就是主“数据源”,它定义了这个表单上面,会包含什么样的数据。
kaneboy@Beijing 说:
然后,每个表单,都有一个XSLT转换文件,负责将数据Schema,转换成我们在设计界面看到的那些由“控件”组成的界面。
kaneboy@Beijing 说:
我们理解到这个层次,也就差不多了
sailsoft@yeah.net (E-mail Address Not Verified) 说:
开始了吗?
kaneboy@Beijing 说:
所以,一个InfoPath表单,和一个Windows Forms完全不一样。Windows Forms,是一个由各种控件所组成的一组控件容器,我们(包括代码)操作的,都是单个的控件,比如,设置某个文本框控件的Text属性,就改变了这个控件里面包含的文本值。
kaneboy@Beijing 说:
但是在InfoPath表单上,就不能这样理解了。
sailsoft@yeah.net (E-mail Address Not Verified) 说:
请问,课程开始了吗?
kaneboy@Beijing 说:
开始了。
sailsoft@yeah.net (E-mail Address Not Verified) 说:
sorry
北京㊣Yuki 说:
开始了,听课吧
sailsoft@yeah.net (E-mail Address Not Verified) 说:
en
kaneboy@Beijing 说:
当我们开始设计一个空白表单的时候,表单的数据Schema是空的,就像是:
<my:fields>
</my:fields>
kaneboy@Beijing 说:
这时,我们拖了一个文本框控件到表单上,并且打开这个文本框的属性窗口,将它的名字改为“姓名”,那么在后台,这个表单的数据Schema就变成了类似:
<my:fields>
  <my:姓名></my:姓名>
</my:fields>
kaneboy@Beijing 说:
再拖动一个选择框到表单上,将选择框的名称改为“部门”,这个表单的数据schema就变成了类似:
<my:fields>
  <my:姓名></my:姓名>
 <my:部门></my:部门>
</my:fields>
瞬间 说:
和WPF类似?
广州㊣夏天 说:
------------------------------------------------------------------
讲课时间,请大家不要再发言,提问时间再说
------------------------------------------------------------------
kaneboy@Beijing 说:
InfoPath表单模板的数据schema,完全只记录了数据的结构,可以看到,它根本不关心,用户看到的最终的界面是什么,比如,“/my:fields/my:姓名”这个节点,是对应一个文本框?还是选择框?数据schema是不关心的。
kaneboy@Beijing 说:
数据schema永远只关心表单上的数据的结构!理解这一点很重要
kaneboy@Beijing 说:
所以,我们可以鼠标右击“部门”下拉列表框,然后选择“更改为 - 文本框”,就将表单上,这个数据的表现控件换成了文本框。但是数据schema不会因此有任何更改。
kaneboy@Beijing 说:
在任何时候,我们都可以通过选择InfoPath右侧的“数据源”这个任务窗格,看到整个表单的数据schema是怎样的。

赵培,有志者事竟成,加油! 说:
在MOSS里边的搜索功能页显示该页无法显示,是什么原因呀?
济南㊣Starfish 说:
------------------------------------------------------------------
讲课时间,请大家不要再发言,提问时间再说
------------------------------------------------------------------
kaneboy@Beijing 说:
表单的数据schema,和表单的表现控件,不一定非要一一对应。

赵培,有志者事竟成,加油! 说:
在MOSS里边的搜索功能页显示该页无法显示,是什么原因呀?
大连㊣Thunder.Sun 说:
讲课时间,再提问的,一律踢出群,我不重复了
kaneboy@Beijing 说:
比如,我们可以先拖一个文本框到表单上,InfoPath在后台会自动往数据schema里面添加一个数据节点,但我们可以在“数据源”任务窗格,手工从数据schema中删除这个数据节点。这个时候,表单上的这个表现控件,就不会对应到任何数据schema节点了。


kaneboy@Beijing 说:
同样,我们可以在“数据源”任务窗格中,手工填写新的数据节点,这时,这些数据节点,是没有对应到任何表现控件的。

kaneboy@Beijing 说:
所以,设计表单的时候,以后可以不要总是只使用“控件”任务窗格了,“数据源”这个任务窗口,也是非常非常重要的
赵培,有志者事竟成,加油! 说:
在MOSS里边的搜索功能页显示该页无法显示,是什么原因呀?
kaneboy@Beijing 说:
理解了这个,再了解如何做InfoPath开发,就简单了。
M群-赏梅斋-MOSS开发 说:
【系统提示】有新用户 Kimi-小晖 加入群中
赵培,有志者事竟成,加油! 说:
群里边不就是提问题,大家交流的吗?
大连㊣Thunder.Sun 说:
M群-赏梅斋-MOSS开发 说:
【系统提示】赵培,有志者事竟成,加油!已退出群。
刘哥   luke -猪,要冬眠了 说:
傻X啊你
kaneboy@Beijing 说:
因为我们不会再使用类似

this.txtName.Text = "kb";

这样的代码,来试图给表单上的控件设置值了。
kaneboy@Beijing 说:
然后,来讲讲做infopath开发。嗯,我重点介绍如何用托管代码做开发吧。
kaneboy@Beijing 说:
也就是用C#/VB.NET
kaneboy@Beijing 说:
我们有两种方式:VSTA / VSTO
广州㊣邓 说:
/h
kaneboy@Beijing 说:
先说VSTO,它是Visual Studio Tools for Office的简称,内置在了Visual Studio 2008里面。我们可以直接在VS2008里面新建一个VSTO项目,选择“InfoPath表单模板”这个项目模板即可。
kaneboy@Beijing 说:
还有第二个方法:VSTA,Visual Studio Tools for Application。
kaneboy@Beijing 说:
InfoPath 2007中,内置了VSTA,它就像是一个简化版的Visual Studio 2005,专门for InfoPath开发的。
kaneboy@Beijing 说:
在设计表单模板时,我们通过“工具 - 编程 - VSTA”,就可以打开VSTA,并针对当前的表单模板,进行开发。
kaneboy@Beijing 说:
我的意见是,大部分情况下,用VSTA就足够了。
kaneboy@Beijing 说:
用c#开发表单模板,无疑是很爽的一件事情,但是,如果不知道如何操作表单上的数据,那么就很郁闷了。
kaneboy@Beijing 说:
一个表单模板,背后的代码语言只能是一种,比如,C#
kaneboy@Beijing 说:
通过“工具 - 表单选项 - 编程”,可以设置背后的代码,用哪种语言。
kaneboy@Beijing 说:
我通过例子,来说明如何开发吧。
上海㊣希望 说:
h
kaneboy@Beijing 说:
比如,还是我们上面的那个表单模板的例子,我们往表单里面放了两个控件,现在表单的数据源schema是:
<my:fields>
  <my:姓名></my:姓名>
 <my:部门></my:部门>
</my:fields>

kaneboy@Beijing 说:
顺便说一句:大家在“数据源”任务窗格看数据schema,看不到“my:”这个xml namespace
kaneboy@Beijing 说:
只会是“fields”这样的格式
Jerry 说:
请教个问题:以前在SPS2003中有个显示原油价格与股票行情的WEBPART,在MOSS2007中这二个WEBPART到哪 里去了?
kaneboy@Beijing 说:
Jerry,等会提问吧,到16:00。
Jerry 说:
OK
kaneboy@Beijing 说:
假如,我们希望表单打开时,自动将“姓名”这个文本框里面的数据,设置为“kb”,要如何做呢?
kaneboy@Beijing 说:
选择“工具- 编程 - Loading事件”,窗口会自动跳到VSTA,并且在VSTA里面,已经帮我们生成了一个事件方法,FormEvents_Loading()
kaneboy@Beijing 说:
首先,我们不能操作控件,只能操作数据。InfoPath表单上的数据都是XML格式的,所以,我们要先拿到整个表单的XML数据的那个XPathNavigator对象,就能使用XPath,来操作这些数据了。

 

kaneboy@Beijing 说:

XPathNavigator root = this.MainDataSource.CreateNavigator();

上面的代码,拿到了整个表单,对应的主数据源的XML DOM

 

 

kaneboy@Beijing 说:
然后,我们要查找到对应的“姓名”数据节点:

XPathNavigator nameNode = root.SelectSingleNode("/my:myFields/my:姓名", this.NameSpaceManager);

 

 

kaneboy@Beijing 说:

上面的一行代码,就找到了对应的“姓名”这个数据节点。

 

可以看到,操作InfoPath数据,就是标准的XPath编程。如果熟悉XPath,那么会觉得很容易,如果不熟悉,嗯,就花1-2天的时间,摸爬滚打一下吧。

 

 

nameNode.SetValue("kb");

设置这个节点的值为“kb”。很简单吧?

 

其实,针对InfoPath开发,最麻烦的一点,就是如何知道某个数据节点对应的XPath路径?比如,怎么知道“姓名”节点对应的XPath路径是“/my:myFields/my:姓名”?

 

如果不知道一个节点的XPath路径,就没有办法用Select()、SelectSingleNode()之类的方法,查询到这个节点。

 

要得到一个节点,最简单的方法,就是在InfoPath窗口的“数据源”任务窗格,选中某个节点,点击右边的下拉按钮,然后在菜单中选择“复制XPath”,那么这个节点所对应的XPath路径,就被自动复制到了剪贴板上。

 

通过用XPath操作表单数据,我们几乎可以实现任意的效果。比如,自动向重复表中添加数据行。

 

InfoPath客户端的开发,就说到这里。客户端的开发的一个重要资源,就是InfoPath Team Blog:http://blogs.msdn.com/infopath/

然后讲讲SharePoint Forms Services。

 

FS最大的作用之一,就是将表单能展现成web的形式,使用户只用浏览器,就能填写表单了。

 

FS也是可以直接包含了托管代码的表单模板的。

 

但是,发布包含托管代码的表单模板,不能像普通表单模板那样,直接在infopath中发布到sharepoint上。

 

首先,在infopath中发布表单,选择发布到一个网络位置,然后随便选本地磁盘上的一个位置,发布到自己电脑的磁盘上即可。

 

然后,打开sharepoint管理中心。

 

在应用程序管理页面上,会有一个“InfoPath Forms Services”区域。进入到管理表单模板页面

 

将那个发布到本地磁盘的表单模板文件(.xsn)上传到表单模板库。

 

上传之后,FS会自动检测,这个表单模板是否能够被发布成web。

 

如果可以,你就可以在这个表单模板库里面,将这个表单模板,激活到一个指定的网站集了。激活到一个网站集,会在那个网站集中,新增一个feature。

 

到网站集的功能管理中,激活这个feature,这个feature会为这个网站集添加一个新的内容类型。

 

然后手工创建一个表单库,然后在表单库设置中,启用它的内容类型管理,然后将那个表单模板对应的内容类型添加到这个表单库,就OK了!

 

要让一个infopath表单模板,能被FS发布成web,需要在infopath设计时,使用“工具 - 表单选项 - 兼容性”,然后选中“设计一个可在浏览器或....”这个复选框。

 

选中之后,infopath会自动做兼容性检测,告诉你,当前表单上,有哪些功能是不被FS的Web支持兼容的。

 

不是所有infopath功能,都支持在web中实现的。

 

另外,在web上展现infopath表单,你可能会发现,性能有问题。

 

当infopath表单通过web展现的时候,它是用了ajax技术,在后台提交当前填写的所有数据到后台服务器,然后在服务器上执行一些操作,然后再写会到web页面上。这样的往返过程,可能会让用户填写表单的体验很不好。所以,在设计表单时,

 

务必认真考虑用户在web中填写表单的体验问题。

 

在infopath team blog上,有一个系列文章,专门讲这个性能问题的,如果你遇到了这个问题,可以参考一下:
http://blogs.msdn.com/infopath/archive/2008/05/09/designing-browser-enabled-forms-for-performance-in-infopath-forms-services.aspx

 

 

posted on 2008-11-14 16:08 晃晃悠悠 阅读(...) 评论(...)  编辑 收藏