Практическое руководство. Чтение значения поля в элементе списка
Дата последнего изменения: 16 апреля 2010 г.
Применимо к: SharePoint Foundation 2010
В этой статье
Обзор
Получение ссылки на список
Получение ссылки на элемент списка
Получение значения поля
В этом разделе объясняется, как программно считывать значение конкретного поля (столбца) в заданном элементе списка.
Обзор
Чтобы считать значение заданного поля в элементе списка, в коде сначала необходимо получить ссылку на веб-сайт, на котором развернут список, затем ссылку на сам список, ссылку на элемент списка и наконец ссылку на заданное поле. Основное внимание в этом разделе уделяется последним трем шагам, особенно самому последнему. Дополнительные сведения о получении ссылок на веб-сайты см. в разделе Получение ссылок на сайты, веб-приложения и другие ключевые объекты.
Получение ссылки на список
Получив ссылку на веб-сайт, на котором содержится список, можно получить ссылку на список, вызвав метод GetList(String) объекта SPWeb, или с помощью индекса свойства 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 доступен метод "Get" для возврата определенного типа объекта, следует использовать его вместо индекса коллекции. В общем случае, следуя этому правилу, можно добиться большей производительности. В этом случае, если код может передавать необходимый относительный к серверу URL-адрес списка во время выполнения, следует использовать метод GetList(String) вместо индекса свойства SPWeb.Lists. |
Получение ссылки на элемент списка
После получения ссылки на список есть несколько вариантов получения ссылки на конкретный элемент списка. Для наибольшей производительности рекомендуется использовать метод GetItemByIdSelectedFields(Int32, []) объекта SPList. Первым параметром является идентификатор элемента. При добавлении каждого нового элемента в список он получает целочисленный идентификатор на единицу больше идентификатора предыдущего добавленного элемента. При удалении элемента из списка его идентификатор повторно не используется. Вторым параметром является массив внутренних имен полей элемента, который нужно получить из базы данных содержимого. Для максимальной производительности включайте только поля элемента списка, к которым код будет обращаться позже. См. следующий пример.
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, которое в этом случае имеет значение "Розничная цена ".
Если требуется получить все поля элемента списка, используйте метод GetItemByIdAllFields(Int32). Его единственным параметром является идентификатор элемента. Существует несколько специальных методов для получения элементов списка определенных типов. Если известен GUID-идентификатор элемента (значение его свойства UniqueId), а не значение его свойства ID, используйте метод GetItemByUniqueId(Guid).
Если GUID-идентификатор или идентификатор элемента списка не известен, но известно значение некоторых других его полей или свойств, можно использовать одно из переопределений метода 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. Используйте предложение select запроса LINQ, чтобы указать только необходимые поля. Дополнительные сведения о запросах LINQ к SharePoint см. в статье Практическое руководство. Выполнение запроса с помощью LINQ to SharePoint.
Важно! |
---|
Объект SPList имеет свойство Items, к элементам которого обращаться с помощью индекса, однако рекомендуется этого не делать, поскольку такой метод приводит к извлечению из базы данных содержимого всех метаданных для всех элементов списка. |
Получение значения поля
Получив ссылку на необходимый элемент списка, в коде можно считывать значение любого поля с помощью индекса объекта SPListItem. Существуют индексы типа Guid, Int32 и String. Индекс Guid можно использовать, если известно значение свойства Id поля. Индекс Int32 можно использовать, если известен номер столбца в начинающейся с нуля коллекции в родительском списке. Индекс String можно использовать, если известно значение свойства InternalName, Title или StaticName поля. Среда выполнения ищет строку сначала во внутренних именах, затем в заголовках полей и наконец в статических именах полей, поэтому код получается более производительным при использовании внутреннего имени (если оно известно). Ниже приводится пример этого метода. Обратите внимание, что индексатор всегда возвращает значение поля в типе 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"]).
GetFieldValueAsHtml(Object) Действует идентично методу SPListItem.GetFormattedValue(String). См. выше.
GetFieldValueAsText(Object) — возвращает значение поля в типе String.
GetFieldValueForEdit(Object) При переопределении в производном классе возвращает значение поля в формате, более подходящем для формы редактирования или создания элементов списка, например, в виде значения даты и времени, отформатированного в соответствии с пользовательскими региональными параметрами.
GetValidatedString(Object) При переопределении в производном классе возвращает строковое значение поля, прошедшее проверки.
GetFieldValue(String) При переопределении в производном классе возвращает значение поля, когда базовое значение имеет сложный тип данных, например, SPFieldUrlValue или пользовательский тип данных.
Для использования любого из этих методов необходимо получить ссылку на поле в виде объекта SPField. Это делается с помощью свойстваSPListItem.Fields элемента списка. Это коллекция полей в родительском списке. Тип равен SPFieldCollection. Этот объект в свою очередь предлагает несколько способов возвращения заданного объекта SPField.
Использование метода GetField(String). Ему передается внутреннее имя, заголовок или статическое имя поля. Сначала выполняется поиск внутреннего имени, поэтому для повышения производительности рекомендуется использовать внутреннее имя (если оно известно). Поиск статического имени выполняется в последнюю очередь.
Использование метода GetFieldByInternalName(String).
Использование метода TryGetFieldByStaticName(String).
Использование индекса Guid, Int32 или String свойства SPListItem.Fields элемента списка. Первый индекс возвращает объект SPField, свойство Id которого совпадает с переданным объектом Guid. Второй индекс возвращает объект SPField в указанной порядковой позиции в начинающейся с нуля коллекции. Третий индекс возвращает объект SPField, свойство Title которого совпадает с переданной строкой. (Использовать внутреннее имя поля в качестве строкового индекса нельзя.)
В следующем коде показаны некоторые примеры использования индексов и методов классов, производных от 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"]);
}
}