在MOSS中开发和部署Infopath - MOSS中文社区 SharePoint中文社区 - Powered by Discuz!NT

来源:百度文库 编辑:神马文学网 时间:2024/04/27 15:53:39

在MOSS中开发和部署Infopath

Infopath是Office中提供的一个部件,可以方便快捷的处理一些表单。比较常见的使用就是会计可以利用Infopath制作一个表单模板,需要报销的人直接填写就可以了,填写好的表单可以xml的格式保存为本地的一个表单文件。p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
同时也可以将Infopath表单模板在web页面上来呈现和填写。在MOSS中提供了InfoPath Forms Services功能可以方便的发布Infopath表单,当然在Web上使用Infopath在功能上会有一些限制。p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
本文要实现功能如下:编写一个Infopath表单,发布到Moss中(嵌入到原有的MOSS页面中),当提交时将表单中的数据保存到数据库中去。(模拟一个用户编辑功能)p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
一、前期准备p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
要开发一个包含C#代码的Infopath表单有两种方式:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
1、安装VSTO,装好之后可以直接在VS2005 Team System中编辑表单模板和编写C#代码p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
2、在添加/删除程序中修改VS2005的安装,添加安装VSTA(Visual Studio 2005 Tools for Applications)p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
我这里采用的是第二种方式p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
二、开发Infopath表单模板p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
1、打开Infopath新建一个表单模板:UserEditp %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
2、修改开发部署环境:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
    2.1 在工具-〉选项-〉设计中将语言改为C#p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
    2.2 在工具-〉表单选项-〉编程中将语言改为C#p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
    2.3 在工具-〉表单选项-〉兼容性-〉浏览器兼容(为了将表单可以发布在web页面上)p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
    2.4 安全和信任p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
  选择“工具”-〉“表单选项”-〉“安全和信任”p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
    因为我们在表单中使用了C#代码,所以在“安全级别”方面,要选择“完全信任”:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
  与此同时,因为表单有代码,而且安全级别设置为“完全信任”,相应的,“表单模版签名”要选择“为此表单模版签名”。在这个演示中,我们使用windows自己的证书。即选择“创建证书”:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
    2.5 设置在web中可以显示哪些表单按钮p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
在这里我们一定要设置提交按钮,在下面编写表单时,对控件的验证只有当点击提交按钮时才会执行。如果是保存按钮会忽略验证强制保存的p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
3、编写表单模板p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
页面设计部分比较简单,都是一些所见即所得的操作,在设计的时候也可以给页面控件加上验证,比如不能为空,正则验证等,功能还是很强大的。p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
下图是演示的页面布局和简单的验证操作,具体步骤我就不详细列举了:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
有一个要注意的地方就是Infopath中不支持password格式的输入框,在google中查了一下,好像目前只能将字体设为Wingdings来部分达到效果p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
4、编写代码p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
在工具-〉编程-〉Loading事件会直接打开VS2005进行代码编写的。p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
这里的代码编写和普通的Asp.Net比较类似,要注意的主要有两个方面:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
a、对Infopath中的表单控件值的存取都要使用类似xml的方式:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
  MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:txtID", NamespaceManager).SetValue(memberId);p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
通过内置的MainDataSource对象来存取p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
b、使用页面对象的方法(如取得页面的输入参数):p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
  memberId = System.Web.HttpContext.Current.Request.QueryString.Get("ID");p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
    当然首先要添加System.Web的引用p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
FormEvents_Loading事件的代码如下:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
Codep %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
publicp %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
void FormEvents_Loading(object sender, LoadingEventArgs e)p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
       
{p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
           
string memberId =p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
string.Empty;p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
           
tryp %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
           
{p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
                memberId
= System.Web.HttpContext.Current.Request.QueryString.Get("ID");p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
               
if (string.IsNullOrEmpty(memberId))p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
               
{p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
                    memberId
=p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
"1";p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
                }
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
                MainDataSource.CreateNavigator().SelectSingleNode(
"/my:myFields/my:txtID", NamespaceManager).SetValue(memberId);p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
                p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
               
using (SqlConnection connection =p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
new SqlConnection("server=***;User ID=***;Password=***;database=****;Connection Reset=FALSE"))p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
               
{p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
                    SqlDataAdapter sqlData
=p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
new SqlDataAdapter("select * from member where memberid="p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
+ memberId, connection);p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
                    DataTable dt
=p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
new DataTable();p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
                    sqlData.Fill(dt);p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
                   
if (dt.Rows.Count >p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
0)p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
                   
{p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
                        MainDataSource.CreateNavigator().SelectSingleNode(
"/my:myFields/my:txtName", NamespaceManager).SetValue(dt.Rows[0]["Name"].ToString());p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
                        MainDataSource.CreateNavigator().SelectSingleNode(
"/my:myFields/my:txtPassword", NamespaceManager).SetValue(dt.Rows[0]["Password"].ToString());p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
                        MainDataSource.CreateNavigator().SelectSingleNode(
"/my:myFields/my:txtPhone", NamespaceManager).SetValue(dt.Rows[0]["Tel"].ToString());p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
                    }
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
                }
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
            }
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
           
catch (Exception ex)p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
           
{p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
                MainDataSource.CreateNavigator().SelectSingleNode(
"/my:myFields/my:txtMessage", NamespaceManager).SetValue(ex.ToString());p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
            }
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
        }
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
代码比较简单:一开始取得前一个页面传递的ID值,然后根据这个ID从数据库中取得用户信息,显示在Infopath的控件中供修改。p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
同理,我们还要写一个submit事件,当提交时将修改后的值保存到数据库中去:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
Codep %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
publicp %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
void FormEvents_Submit(object sender, SubmitEventArgs e)p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
       
{p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
           
tryp %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
           
{p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
               
using (SqlConnection connection =p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
new SqlConnection("server=****;User ID=****;Password=****;database=****;Connection Reset=FALSE"))p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
               
{p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
                   
string strSql =p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
"update member set name='"p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
+p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
                      MainDataSource.CreateNavigator().SelectSingleNode(
"/my:myFields/my:txtName", NamespaceManager).Value +p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
                     
"', password='"p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
+ MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:txtPassword", NamespaceManager).Value +p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
                     
"', tel='"p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
+ MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:txtPhone", NamespaceManager).Valuep %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
                     
+p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
"' where memberid="p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
+ MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:txtID", NamespaceManager).Value;p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
                    ;p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
                    SqlDataAdapter sqlData
=p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
new SqlDataAdapter(strSql, connection);p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
                    DataTable dt
=p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
new DataTable();p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
                    sqlData.Fill(dt);p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
                }
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
               
// 如果提交操作成功,则设置p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
                e.CancelableArgs.Cancel =p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
false;p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
               
//System.Web.HttpContext.Current.Response.Write("");p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
            }p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
           
catch (Exception ex)p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
           
{p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
                MainDataSource.CreateNavigator().SelectSingleNode(
"/my:myFields/my:txtMessage", NamespaceManager).SetValue(ex.ToString());p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
            }
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
        }
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
三、发布和部署Infopathp %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
表单开发好之后,下面就是要把它部署到MOSS上面去了p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
如果表单中没有代码,那可以非常方便的把模版发布到文档库中。如果有了代码,那就只能有一种方式,就是需要管理员审批。原理是,表单作者将表单库发布到SharePoint上,其实是把表单发布到一个管理员可以访问到的地方(比如网络共享服务器)。管理员需要将表单模版上传到管理中心的“管理表单”,确定将表单在“网站集”激活、可用。最后,管理员,需要在“网站集”上激活相应的表单模版。这样的过程虽然非常复杂,但是对于管理员维护表单模版非常方便。将模版的使用及开发、审核分开。p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
具体步骤如下:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
1、在Infopath中发布p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
文件-〉发布:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
具有或不具有Infopath Forms Services的Sharepoint服务器p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
然后一直下一步(选择一个列表放置这个Infopath表单模板)p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
一定要选择:使用户可以通过浏览器填写此表单p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
2、激活此表单p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
2.1 进入MOSS的管理中心-〉应用程序管理-〉上载表单模板:选择我们在前一个步骤中发布的表单模板,以后当修改此表单后只需要在这一步骤中选择升级就可以了,不需要进行2.2的操作。p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
2.2 进入个人开发的MOSS网站 网站操作-〉网站设置-〉网站集功能 激活UserEdit这个功能,激活后会自动将这个表单模板放到个人网站的/FormServerTemplates(表单库模板)目录下p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
(之后可以添加此类型的表单库,在表单库设置中:高级-〉允许管理内容类型  显示为网页,从现有网站内容类型添加。此演示中不需要使用此功能)p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
3、在MOSS页面中嵌入此表单模板p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
常规的MOSS中的表单都是作为一个单独的页面呈现的,如果需要把它嵌入在原有的MOSS页面中,需要进行一些特殊处理p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
3.1 在web.config中注册:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
<SafeControl Assembly="Microsoft.Office.InfoPath.Server, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" Namespace="Microsoft.Office.InfoPath.Server.Controls" TypeName="*" Safe="True"p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
/>p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
3.2 在MOSS页面的头部加入引用:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
<%@ Register Tagprefix="InfoPath" Namespace="Microsoft.Office.InfoPath.Server.Controls" Assembly="Microsoft.Office.InfoPath.Server, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
%>p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
3.3 在页面需要的位置加入表单:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
<InfoPath:XmlFormView XsnLocation="/FormServerTemplates/UserEdit[1].xsn" ShowFooter="false" id="FormControl" Style="width:100%;" runat="server"/>p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
加入之后的效果如下:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
也可以进行正常的验证操作了,当提交时会把值保存到数据库中。p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
后记:p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
Infopath使用的方式很多,本文只是提供了一个可能的实现方式,希望对大家有用,如果有更好的方式也欢迎指出。p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
p %|¥f?Ónforums.mosstec.cn~2'õsû??»Þ
转载:http://www.cnblogs.com/dujun0618/articles/1140130.html
在MOSS中开发和部署Infopath - MOSS中文社区 SharePoint中文社区 - Powered by Discuz!NT Office SharePoint Server 2007 的可下载书籍 - MOSS中文社区 SharePoint中文社区 - Powered by Discuz!NT 在MOSS中开发和部署Infopath MOSS 2007应用日记(1)——如何修改网站URL - SharePoint Server - WinOS中文技术论坛 微软技术社区|专注Windows平台IT Pro技术讨论交流 军盟中文网社区 - 军事杂谈 - 美国对中国的几个无奈! - powered by Discuz! 军盟中文网社区 - 军史战史 - 日本油画中看中国军队 - powered by Discuz! 军盟中文网社区 - 武器装备 - 世界上最怪异的手枪大全 - powered by Discuz! 游走在中俄边境的兽中之王 - 华夏地理社区 美国国家地理中文网站- Powered by ... 中国最美的6个女人 - 爱播社区 - Powered by Discuz!NT 足太阴脾经及穴位图之二 - 灵山社区 灵山文化网 - Powered by Discuz!NT 军盟中文网社区 - 武器装备 - 中国陆军特种部队与武警特警队之对比 - powered by Discuz! 走在运河边上 - 华夏地理社区 美国国家地理中文网站- Powered by SupeSi... 南北大运河和京杭大运河 - 华夏地理社区 美国国家地理中文网站- Powered by S... 宏天J.Office协同办公OA源码 开源技术免费看 - 程序超市社区 - Powered by Discuz!NT 使用jQuery写的树,树的内容在xml中定义 |jQuery基础入门 - jQuery中文社区 - Powered by PHPWind 实现在Flash课件中显示系统时间和上课时间 - flash技术 - 教育技术思考 专业教育技术学习社区 - Powered by Discuz! 世界史上最成功的12大王朝 中国占两个 激动社区-大型视频化综合娱乐社区 - 激动社区 - Powered by Discuz!NT 先学后教当堂训练 - Powered by Discuz!NT 军盟中文网社区 - 游戏下载 - 让您的假期多姿多彩_祖玛系列等十二款绿色游戏 - powered by Discuz! 优秀英中文资讯资料网 - powered by Discuz! 洗涤心灵的照片--中国最美的6个女人 1- 爱播社区 - Powered by Discuz!NT 大运河拿什么申遗 - 华夏地理社区 美国国家地理中文网站- Powered by Supe... 大运河究竟有多长? - 华夏地理社区 美国国家地理中文网站- Powered by Sup... 唐代的大运河茶叶贸易 - 华夏地理社区 美国国家地理中文网站- Powered by Su...