使用列表对象和集合
上次修改时间: 2010年4月9日
适用范围: SharePoint Foundation 2010
本文内容
对象
集合
索引器
若要对 SharePoint 网站中的列表数据执行操作,您必须首先获取一个作为对象模型入口点的 SPWeb 对象,以便能够访问列表、项目、文档、用户和通知等等。有关如何返回 SharePoint 网站的信息,请参阅获取对网站、Web 应用程序和其他关键对象的引用。
对象
Microsoft.SharePoint 和 Microsoft.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.Administration
概念
SharePoint Foundation 对象模型中的命名空间