使用列表对象和集合

上次修改时间: 2010年4月9日

适用范围: SharePoint Foundation 2010

本文内容
对象
集合
索引器

若要对 SharePoint 网站中的列表数据执行操作,您必须首先获取一个作为对象模型入口点的 SPWeb 对象,以便能够访问列表、项目、文档、用户和通知等等。有关如何返回 SharePoint 网站的信息,请参阅获取对网站、Web 应用程序和其他关键对象的引用

对象

Microsoft.SharePointMicrosoft.SharePoint.Administration 命名空间中的大多数类都以 SP 开头。通常,Microsoft.SharePoint 程序集中不以此前缀开头的类表示 Web 表单控件。

在对指定对象调用 Update 方法之前,SharePoint Foundation 通常不会将对象属性的更改保存到数据库。下面的示例演示如何更改任务列表的标题和说明。

         
Dim oList As SPList = oWebsite.Lists("Tasks")
oList.Title = "New_Title"
oList.Description = "List_Description"
oList.Update()
SPList oList = oWebsite.Lists["Tasks"];
oList.Title="New_Title";
oList.Description="List_Description";
oList.Update();

备注

如果从文档库签出文档,则无法使用 SPListItem 对象的 Update() 方法修改文档的元数据。

集合

就像列表位于 SharePoint 网站中心一样,集合也位于其对象模型中心。您可以使用每个集合添加、删除、枚举和更新对象的类型。Collection 类通常具有下面的共同特征:

  • 具有一个以"Collection"结尾的名称。

  • 实现 System.Collections.ICollection 接口。

  • 具有 Int32 类型的 Count 属性。

  • 具有一个可用于获取集合中第 nth 个项的 Int32 索引器。

  • 具有一个采用项标识符的索引器。

  • 具有 Add 和 Delete 方法。

对集合调用 Add 方法时通常会使用相应数据更新后端服务器上的数据库,而必须使用附加信息更新数据的情况例外。在这种情况下,使用 Add 方法会返回一个可用于收集信息的对象。例如,若要向列表中添加项目,请先使用 Microsoft.SharePoint.SPListItemCollection 类的 Add 方法返回一个 SPListItem 对象,再向该对象的相应属性分配值,然后调用 Update 方法以使内容数据库中的更改生效。

索引器

索引器可提供用于访问集合中各个项目的有用方法。若要返回项目,请在 Microsoft C# 中使用方括号 ([]) 或在 Microsoft Visual Basic 中使用括号 (()),以包含标识集合中的项目的索引或字符串。

例如,如果 oWebsite 表示 SPWeb 类的一个实例,则在 C# 中 SPList oList = oWebsite.Lists["Announcements"] 会返回通知列表,而在 Visual Basic 中 Dim oList As SPList = oWebsite.Lists("Announcements") 会返回相同的列表。

若要从列表返回项目,最好是调用其中一个列表对象的 GetItem* 方法并指定要检索的项目。使用 Items 属性获取列表中的所有项目会降低性能,因为它会强制返回所有项目的所有列。例如,改用 GetItems 方法并传递 SPQuery 对象以指定子集:SPListItemCollection collItem = oList.GetItems(oQuery)(在 Visual Basic 中为 Dim collItem As SPListItemCollection = oList.GetItems(oQuery))。

使用 GetItem* 方法从列表返回项目集合后,可以将字段名称指定为索引器,并循环访问集合以返回字段的值。下面的示例显示集合中每个项目的截止日期、状态和标题值。

Dim oItem As SPListItem

For Each oItem In  collItem

    Response.Write(SPEncode.HtmlEncode(oItem("Due Date").ToString()) + "<BR>")
    Response.Write(SPEncode.HtmlEncode(oItem("Status").ToString()) + "<BR>")
    Response.Write(SPEncode.HtmlEncode(oItem("Title").ToString()) + "<BR>")

Next oItem
foreach(SPListItem oItem in collItem)
{
    Response.Write(SPEncode.HtmlEncode(oItem["Due Date"].ToString()) + "<BR>");
    Response.Write(SPEncode.HtmlEncode(oItem["Status"].ToString()) + "<BR>");
    Response.Write(SPEncode.HtmlEncode(oItem["Title"].ToString()) + "<BR>");
}

备注

除了需要 Microsoft.SharePoint 命名空间的 using 指令(在 Visual Basic 中为 Imports)之外,上面的示例还需要 Microsoft.SharePoint.Utilities 命名空间指令。

下面的示例演示如何返回 SharePoint 网站中任务列表的所有标题值和状态值。

Dim oWebsite As SPWeb = SPContext.Current.Web
Dim oList As SPList = oWebsite.Lists("Tasks")
Dim collItem As SPListItemCollection = oList.GetItems("Title", "Status")

Dim oItem As SPListItem
For Each oItem In  collItem

    Response.Write(SPEncode.HtmlEncode(oItem("Title").ToString()) + " :: " _
        & SPEncode.HtmlEncode(oItem("Status").ToString()) + "<BR>")

Next oItem
SPWeb oWebsite = SPContext.Current.Web;

SPList oList = oWebsite.Lists["Tasks"];
SPListItemCollection collItem = oList.GetItems("Title", "Status");

foreach(SPListItem oItem in collItem)
{
    Response.Write(SPEncode.HtmlEncode(oItem["Title"].ToString()) + " :: " + 
        SPEncode.HtmlEncode(oItem["Status"].ToString()) + "<BR>");
}

如果已实现请求限制,则无效查询可能会因过多查找计数或项计数问题受阻。您可以提高查询效率,减少查找计数问题,具体方法是:定义用于指定一组受限视图字段 (ViewFields) 的 SPQuery 对象,然后将此查询对象传递给 GetItems 方法,如下面的示例所示。

Dim oQuery As New SPQuery()
oQuery.Query = "<ViewFields><FieldRef Name = ""Title"" />" & 
    "<FieldRef Name = ""Status""/></ViewFields>"
Dim collItem As SPListItemCollection = oList.GetItems(oQuery)
SPQuery oQuery = new SPQuery();
oQuery.Query  =  "<ViewFields><FieldRef Name = \"Title\" />" +
    "<FieldRef Name = \"Status\"/></ViewFields>";
SPListItemCollection collItem = oList.GetItems(oQuery);

若要解决项计数限制问题,可能需要使用 SPListItemCollectionPosition 类根据项目索引标明结果的页码。

备注

除了需要 Microsoft.SharePoint 命名空间的 using 指令(在 Visual Basic 中为 Imports)之外,上面的示例还需要 Microsoft.SharePoint.Utilities 命名空间的指令。

您还可以使用索引器修改列表中的值。在下面的示例中,将一个新列表项添加到集合中,并将 URL 列的值分配给该项。

Dim oNewItem As SPListItem = oList.Items.Add()

oNewItem("URL_Field_Name") = "URL, _ Field_Description"

oNewItem.Update() 
SPListItem oNewItem = oList.Items.Add();

oNewItem["URL_Field_Name"] = "URL, Field_Description";

oNewItem.Update();

备注

URL 字段类型是唯一的,因为它包含两个值(值之间用逗号和空格分隔),上面的示例将这些值通过一个索引器分配给新项。

下面的示例使用 GetItemById(Int32) 方法返回一个项目,然后设置其"状态"和"标题"列的值。

Dim oItem As SPListItem = oList.GetItemById(1) 

oItem("Status") = "Task_Status"
oItem("Title") = "Task_Title"

oItem.Update() 
SPListItem oItem = oList.GetItemById(1);

oItem["Status"]="Task_Status";
oItem["Title"]="Task_Title";

oItem.Update();

如果可以为项目指定要检索的字段的列表,如果任何字段都不是 Lookup 类型或继承自 SPFieldLookup 的字段类型,则可以通过调用 GetItemByIdSelectedFields(Int32, []) 方法(而不是调用 GetItemById(Int32))来提高性能。

备注

索引器如果找不到指定项,将会引发 ArgumentOutOfRange 异常。

有关 SharePoint Foundation 中的列表项所用特定数据格式的信息,请参阅 SPListItem 类。

请参阅

引用

Microsoft.SharePoint

Microsoft.SharePoint.Administration

概念

如何:从列表返回项

如何:创建或删除列表

如何:添加或删除列表项

如何:读取列表项中字段的值

SharePoint Foundation 对象模型中的命名空间

使用 Visual Studio 进行 SharePoint 开发

获取对网站、Web 应用程序和其他关键对象的引用

注册并导入命名空间