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

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

适用范围: SharePoint Foundation 2010

本文内容
概述
获取对列表的引用
获取对列表项的引用
获取字段的值

本主题说明如何以编程方式读取特定的列表项中的特定字段(列)的值。

概述

若要读取某个列表项中特定字段的值,您的代码必须首先获取对该列表所部署到的网站的引用,再获取对列表自身的引用,然后获取对列表项的引用,最后获取对特定字段的引用。本主题着重介绍最后的三个步骤,尤其是最后一个步骤。有关获取对网站的引用的详细信息,请参阅获取对网站、Web 应用程序和其他关键对象的引用

获取对列表的引用

当您具有对包含相关列表的网站的引用之后,可以通过调用 SPWeb 对象的 GetList(String) 方法或使用网站的 SPWeb.Lists 属性的索引,获取对该列表的引用。若要使用 GetList(String) 方法,您的代码必须能够在运行时传递该列表的相对于服务器的 URL。下面说明了当在设计时已知该列表的相对于服务器的 URL 时使用此方法的示例。

using (SPSite siteCol = new SPSite("https://server/sites/Contoso"))
{
    using (SPWeb web = siteCol.RootWeb)
    {
         SPList list = web.GetList("/sites/Contoso/Lists/Books");
    }
}

有关相对于服务器的 URL 的详细信息,请参阅URL 字符串的格式说明

有三种类型的索引可以与 SPWeb.Lists 属性一起使用。

  • 列表的 GUID;例如 SPList list = web.Lists[new Guid("53bd7850-49cc-4747-aded-e053659ace79")];。GUID 是 SPList.ID 属性的值。

  • 列表在 Lists 集合中的从零开始的序号位置;例如 SPList list = web.Lists[12];。

  • 列表的名称;例如 SPList list = web.Lists["Books"];。该名称是 SPList.Title 属性的值。

上面的最后一种索引最为常见,这是因为您在设计时知道或代码在运行时"知道"列表的 GUID 或其在网站的列表集合中的位置的情况相当少见。

using (SPSite siteCol = new SPSite("https://server/sites/Contoso"))
{
    using (SPWeb web = siteCol.RootWeb)
    {
         SPList list = web.Lists["Books"];
    }
}
提示提示

在 Microsoft SharePoint Foundation 中,如果可使用"获取"方法返回某个特定类型的对象,则应优先使用"获取"方法而不是使用集合索引。一般情况下,遵循此规则可获得更好的性能。在这种情况下,如果您的代码可在运行时传递所需的列表的相对于服务器的 URL,则与使用 SPWeb.Lists 属性的索引相比,应优先使用 GetList(String) 方法。

获取对列表项的引用

当您已具有对相关列表的引用之后,可以通过多种方式来获取对某个特定列表项的引用。为了获得最佳性能,优先的选择是使用 SPList 对象的 GetItemByIdSelectedFields(Int32, []) 方法。第一个参数是列表项的 ID 号。每次向列表中添加某个项时,就会为该项指定一个基于 1 的整数 ID 号,并且此 ID 号比前面添加的项的 ID 号大一。而当从列表删除某个项时,将不再重新使用它的 ID 号。第二个参数是您想要从内容数据库中返回的项字段的内部 名称的数组。若要最大限度地提高性能,应仅包含您的代码稍后将要引用的列表项的字段。下面是一个示例。

using (SPSite siteCol = new SPSite("https://server/sites/Contoso"))
{
    using (SPWeb web = siteCol.RootWeb)
    {
        SPList list = web.GetList("/sites/Contoso/Lists/Books");
        
        SPListItem item = list.GetItemByIdSelectedFields(3, "Title", "ISBN", "Retail_x0020_Price");
    }
}

请注意,示例代码将获取 ID 为 3 的列表项,但仅获取它的三个字段。另请注意,将使用零售价格字段的 InternalName,而不是使用该字段的 Title 属性(在此例中为"Retail Price")。

如果您想要获取列表项的所有字段,请使用 GetItemByIdAllFields(Int32) 方法。项 ID 是此方法唯一的参数。有一些特殊用途的方法可用来获取特殊类型的列表项。如果您知道列表项的 GUID(其 UniqueId 属性的值),而不知道其 ID 属性的值,则使用 GetItemByUniqueId(Guid) 方法。

如果您既不知道列表项的 GUID,也不知道列表项的 ID,但是您知道列表项的其他字段或属性的值,则可使用 GetItems() 方法的一个重载来返回多个列表项,然后使用循环和条件结构来选择您想要的列表项。下面是这一方法的一个示例。

using (SPSite siteCol = new SPSite("https://server/sites/Contoso"))
{
    using (SPWeb web = siteCol.RootWeb)
    {
        SPList list = web.GetList("/sites/Contoso/Lists/Books");
        
        SPListItemCollection items = list.GetItems("Title", "ISBN", "Retail_x0020_Price");
        SPListItem item = null;
        foreach (SPListItem it in items)
        {
            if (it.Title == "Great Expectations")
            {
                 item = it;
            }
        }
}

您还可以通过使用 LINQ to SharePoint 提供程序在某个列表中查询经过筛选的列表项集。可使用 LINQ 查询的 select 子句来指定您想要的字段。有关使用 LINQ 来查询 SharePoint 的详细信息,请参阅如何:使用 LINQ to SharePoint 进行查询

重要注释重要信息

SPList 对象具有一个 Items 属性,您可以使用一个索引来访问该属性的成员。但是我们建议您不要这么做,因为这一方法会导致从内容数据库中提取所有列表项的所有元数据。

获取字段的值

当您具有对您想要的列表项的引用之后,您的代码可以通过使用 SPListItem 对象的索引来读取任意字段的值。存在 GuidInt32String 三种索引。如果您知道字段的 Id,则可使用 Guid 索引;如果您知道字段在父列表中的基于零的列号,则可使用 Int32 索引;如果您知道字段的 InternalNameTitleStaticName,则可使用 String 索引。运行时将依次在内部名称、字段标题、字段静态名称中搜索字符串,因此,如果您在知道内部名称的情况下使用内部名称,则会获得更好的代码运行性能。下面是这一方法的一个示例。请注意,索引器始终会将字段值作为 Object 类型返回。您通常需要像此示例中的做法一样,将 Object 类型转换为更具体的类型。

using (SPSite siteCol = new SPSite("https://server/sites/Contoso"))
{
    using (SPWeb web = siteCol.RootWeb)
    {
        SPList list = web.GetList("/sites/Contoso/Lists/Books");
        
        SPListItem item = list.GetItemByIdSelectedFields(3, "Title", "ISBN", "Retail_x0020_Price");

        String bookISBN = (String)item["ISBN"];
    }
}

如果您想要将字段的值格式化,以便将其作为某个元素的值或某个元素的属性注入到 HTML 代码中,则可使用 SPListItem.GetFormattedValue(String) 方法。此方法会将字段值作为一个字符串返回,但是,如果字段值中包含任何 & 符号、双引号、单引号、小于号或大于号字符,则这些字符将会被替换为相应的 HTML 实体引用。

SPField 类自身(以及从它派生的每个类)有一些可用于通过特殊方式转换字段值的方法。在这些方法中,您首先按上面介绍的方法对 SPListItem 对象使用索引来获取对字段值的引用,然后将该引用作为一个参数传递给这些方法,例如,GetFieldValueAsText(item["ISBN"]).

若要使用上述任一方法,则必须获取对字段的引用来作为 SPField 对象。可以通过使用列表项的 SPListItem.Fields 属性来实现这一点。这是父列表中的字段集合,它的类型是 SPFieldCollection。这个对象又提供了多种返回指定的 SPField 对象的方式。

  • 使用 GetField(String) 方法。传递字段的内部名称、标题或静态名称。将首先搜索内部名称,因此,当您知道内部名称时,可使用内部名称以获得更好的性能。最后才搜索静态名称。

  • 使用 GetFieldByInternalName(String) 方法。

  • 使用 TryGetFieldByStaticName(String) 方法。

  • 使用列表项的 SPListItem.Fields 属性的 GuidInt32String 索引。第一个索引将返回其 Id 属性与所传递的 Guid 对象相匹配的 SPField 对象。第二个索引将返回位于集合中指定的基于零的序号处的 SPField 对象。第三个索引将返回其 Title 属性与所传递的字符串相匹配的 SPField。(不可以将字段的内部名称用作字符串索引。)

下面的代码说明一些有关如何使用 SPListItem 类和 SPField 的派生类的索引和方法来获取字段值的示例。

using (SPSite siteCol = new SPSite("https://server/sites/Contoso"))
{
    using (SPWeb web = siteCol.RootWeb)
    {
        SPList list = web.GetList("/sites/Contoso/Lists/Books");
        
        SPListItem item = list.GetItemByIdSelectedFields(3, "Title", "ISBN", "Retail_x0020_Price");

        // Get price as Double straight from the SPListItem object.
        Double dblPrice = (Double)item["Retail_x0020_Price"];        

        // Get the SPField object by using the GetFieldByInternalName method, and then get
        // price as string. 
        SPFieldCurrency priceField = (SPFieldCurrency)item.Fields.GetFieldByInternalName("Retail_x0020_Price");
        String strPrice = priceField.GetFieldValueAsText(item["Retail_x0020_Price"])

        // Get price as string from the SPField object. Use string SPFieldCollection index 
        // to get the SPField object (must use field object Title as index parameter). But 
        // use internal name of field as SPListItem index for better performance.
          String strPrice2 = item.Fields["Retail Price"].GetFieldValueAsText(item["Retail_x0020_Price"]);
    }
}

请参阅

概念

如何:枚举网站和网站集

如何:从列表返回项