InfoPath进阶之二:给InfoPath添加VSTA托管代码并从SharePoint列表查询数据

导读 摘要:本章节里,我们要学习如何给InfoPath添加代码,然后如何把含有代码的表单模板发布到具有Forms Service的网站上去。本代码比较简单:根据上一章的示例,模板里有一个字段叫“申请人”,这段代码就是根据当前登录的人名,通过代码查询到他的部门,然后自动地填到“申请部门”这个下拉框中去。这样当使用者第一次新建这个表单时,申请人和部门就会自动...

摘要:本章节里,我们要学习如何给InfoPath添加代码,然后如何把含有代码的表单模板发布到具有Forms Service的网站上去。本代码比较简单:根据上一章的示例,模板里有一个字段叫“申请人”,这段代码就是根据当前登录的人名,通过代码查询到他的部门,然后自动地填到“申请部门”这个下拉框中去。这样当使用者第一次新建这个表单时,申请人和部门就会自动填好,这样就会显得模板比较智能。

你将学会:

  1. 如何给InfoPath模板添加代码,并进行发布。
  2. 如何从MOSS的用户配置文件中来读取用户的中文名称
  3. 如何使用OM和Query语句,对SharePoint列表进行查询
  4. 如何在程序中设置表单中某个节点(域)的值
  5. 如何应用Loading事件

一、新建一个表单库,用来存放表单

如下图:

image

二、编辑表单模板,并加入程序

1 以设计模式打开模板,在“工具”-“表单选项”中设置编程语言为c#,如下图:

image

2.设置表单模板的安全级别为“完全信任”和表单模板签名,如下图:

image

3. 在通过菜单中的Loading事件,打开编写程序的界面:

image

4.给程序添加3个必要的“引用”,如图下图,打开“添加引用”对话框,

image

1)给程序集添加WSS的引用,主要使用OM对象模型,如下图:

image

2)给程序集添加Office Server的引用,主要使用配置文件类,如下图:

image

3) 参照之前的例子,再给程序加上System.Web的引用,主要用来使用ServerContext对象。

5 给程序加上代码

1) 给程序加上引用行,如下示例:

//以下需要手动加上去的
using System.Web;
using Microsoft.Office.Server;
using Microsoft.Office.Server.Administration;
using Microsoft.Office.Server.UserProfiles;
using Microsoft.SharePoint;

2) 在Loading事件中加入如下的代码:

            if (this.New) //如果是新的表单,就设置初始值
            {
                //取得当前用户在配置文件中FullName的值
                using (SPSite site = new SPSite("http://oss")) //请把这个值换成你的SharePoint网站的URL
                {
                    //以下根据当前用户登录名来取得用户的配置文件
                    ServerContext context = ServerContext.GetContext(site);
                    UserProfileManager profileManager = new UserProfileManager(context);             
                    UserProfile u = profileManager.GetUserProfile(this.Application.User.LoginName);
                    string fullName = u[PropertyConstants.PreferredName].Value.ToString();

                    XPathNavigator mainNavigator = this.MainDataSource.CreateNavigator();   //取得主数据源的检索游标

                    //设置申请人的节点值为用户名,即配置文件中PreferredName(名称)的属性                   
                    mainNavigator.SelectSingleNode("/my:myFields/my:申请人", this.NamespaceManager).SetValue(fullName);  
                   
                    //根据姓名从SharePoint的部门列表来查询部门
                    using (SPWeb web = site.AllWebs["/demo"]) //请把这个换成你的SharePoint网站的URL
                    {
                        SPQuery query = new SPQuery();
                        //因为姓名字段,是从标题更改而来的,所以其内部名称为Title
                        query.Query = "<Where><Eq><FieldRef Name='Title'/><Value Type='Text'>" + fullName + "</Value></Eq></Where>"; 
                        SPList list = web.Lists["部门人员"];
                        SPListItemCollection items = list.GetItems(query);
                        if (items.Count > 0) //如果查找到了就设置部门的值
                            mainNavigator.SelectSingleNode("/my:myFields/my:申请部门", this.NamespaceManager).SetValue(items[0]["部门"].ToString ());  
 
                    }

                } 
            }
        }
 
 

6 调试看结果

请按image 可以看看调试结果,如下图:

image

三、 部署模板到文档库

程序都调试好了,应该部署到文档库中,如何部署呢?

1. 启动文件菜单中的发布向导,把模板发布到C:盘的根文件夹下,如下图:

image

image

image

image

image

2 把刚才发布的模板上传到管理中心,并激活到网站集

进入管理中心,的“应用程序管理”页面,如下图点击进入上传页面:

image

image

点击上传后,再点击确定,进入模板的列表页面,如下图把这个模板激活到网站集:

image

在配置页面里,如下图配置好使用这个模板的网站集:

image

3 设置文档库

1)首先打开第一步创建的“采购申请”文档库的高级设置,打开内容类型管理,并配置为网页显示这个表单库如下图:

image

2)如下图添加“采购申请单”内容类型:

image

如下图把采购申请单添加进入右边

image

结果如图:

image

3)把这个内容类型设置为唯一模板,并把原有的表单模板删除掉,

点击“更改’新建’按钮的顺序和默认内容类型”,

image

把采购申请单,设置为第1内容类型,如下图:

image

点击进入表单内容类型的设置界面,点击删除:

image

四、测试结果

如下图,点击新建

image

结果如下图,一切正常:

image

  • 相关文章
  • 游戏推荐