2011年5月30日星期一

  通过程序访问SharePoint List[4]: 使用客户端对象模型读取List 中的数据

客户端对象模型是SharePoint 2010中的新的特性,它是开发人员可以远程的访问Share Point List。比如,你可以创建一个Win Form 或者WPF程序,一个Silverlight 程序,或者一段JS脚本来管理向SharePoint 提交或者获取的数据。

通过客户端对象模型,你会发现,相对于上一节使用List Web Service,代码会整洁了很多。比如,你想使用Select 类型的查询,客户端对象模型,有时候会自动生成CAML。并且,它使管理内存中的数据对象也更简单了,你可以使用LINQ,枚举,集合等等。快速有效的查询和过滤数据。

例子:使用客户端对象模型读取List 中的数据。

客户端对象模型提供了一种更有效的访问List中数据的方法。

  1. 打开VS 2010,创建一个Windows Form 程序,取个名字,我取的ReadListData, 请确信使用了.NET Framework 3.5的版本。
  2. 在Form窗口中添加一个label, textbox, DataGrid view, 和两个按钮。如图:

clip_image001

  1. 在你的项目里面添加一个新的in-memory类,叫做"ImployeeInfo"(方法见上一篇文章).

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ReadSPListData

{

class EmployeeInfo

{

public string EmployeeID { get; set; }

public string FirstName { get; set; }

public string HireDate { get; set; }

}

}

  1. 下一步,给按钮Exit 添加处理函数,因为只有一个退出方法,比较简单,双击Exit 按钮,VS自动生成处理函数方法,如下:

private void btnExit_Click(object sender, EventArgs e)

{

Application.Exit();

}

  1. 按钮Load的事件比较麻烦些,所以下一步再说。在你用后台代码使用客户端对象模型的时候,你必须添加相应的应用到你的程序里面。右键点击项目名称,选"Add Reference". 选"Browse" 找到下面的文件:

c:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\ISAPI

and add the Microsoft.SharePoint.Client.dll和Microsoft.SharePoint.Client.Runtime.dll

添加 到你的引用中去。

clip_image002

当使用客户端对象模型的时候,你可能会碰上命名空间的冲突(比如,与窗口程序中的Form 类),要避免这种情况,你可以使用下面的代码:

using ClientOM = Microsoft.SharePoint.Client;

//using Microsoft.SharePoint.Client;

添加一个自定义的命名空间来避免冲突问题。

  1. 这一步将添加从SharePoint List加载数据的代码。你会发现下面的语法和使用List Web Services不太一样,但是实现的功能是一样的,只是语法上更整洁些。

在接下来的代码中,注意程序使用文本框来输入网站地址,并存到字符串变量里面。然后用in-memory的对象来管理从Share Point List里面返回的数据。但是,使用ClientContext对象来设置Context才是关键的与以前的例子不同的地方。设置Context的过程和于Share Point List交互而调用ExecuteQuery(一个batch查询方法)是客户端对象模型的核心特性。你会再一次使用LINQ来生成对象,并遍历整个对象中的内容来获取可绑定的对象来直接映射Datagrid。Foreach 循环的一个关键的地方就是,使用ElementAt属性来设置值。这是指定元素的索引。如果你的执行LINQ的地方加一个断点来查看returnedListData对象,你就会看到所有返回的值及县官的索引。

clip_image003

下面就是Load 按钮的事件处理程序:

private void btnLoad_Click(object sender, EventArgs e)

{

string SPUrl = txtbxSPUrl.Text.Trim();

IEnumerable myListItems;

List myEmployees = new List ();

ClientOM.ClientContext SPContext = new ClientOM.ClientContext(SPUrl);

ClientOM.Web mySPSite = SPContext.Web;

ClientOM.ListCollection myListCollection = mySPSite.Lists;

var employeeList = myListCollection.GetByTitle("Employees");

ClientOM.CamlQuery myCamlQuery = new ClientOM.CamlQuery();

IQueryable myList = employeeList.GetItems(myCamlQuery);

myListItems = SPContext.LoadQuery(myList);

SPContext.ExecuteQuery();

var returnedListData = from emp in myListItems

select emp;

foreach(ClientOM.ListItem tempListItem in returnedListData)

{

EmployeeInfo temEmp = new EmployeeInfo();

temEmp.EmployeeID = tempListItem.FieldValues.Values.ElementAt(11).ToString();

temEmp.FirstName = tempListItem.FieldValues.Values.ElementAt(4).ToString();

temEmp.HireDate = tempListItem.FieldValues.Values.ElementAt(5).ToString();

myEmployees.Add(temEmp);

}

dtgrdSPlistData.DataSource = myEmployees;

}

  1. 基本上这个程序就完成了。不过注意在Form 程序里面直接使用

using Microsoft.SharePoint.Client;

会出现问题,如图

clip_image004

  1. 点击f5进行调试,注意ElementAt()方法使用的索引,如果出错的话,请在对象中查看所有字段的索引。

clip_image005

没有评论:

发表评论