Поделиться через


Работа с объектами List и коллекциями

Дата последнего изменения: 9 апреля 2010 г.

Применимо к: SharePoint Foundation 2010

В этой статье
Объекты
Коллекции
Индексаторы

Для выполнения действий с данными из списка на веб-сайте SharePoint необходимо сначала получить объект SPWeb для использования в качестве точки входа в объектную модель, что позволит получить доступ к спискам, элементам, документам, пользователям, оповещениям и т. д. Сведения о возврате веб-сайтов SharePoint см. в статье Получение ссылок на сайты, веб-приложения и другие ключевые объекты.

Объекты

Большинство классов в пространствах имен Microsoft.SharePoint и Microsoft.SharePoint.Administration начинаются с SP. Обычно классы в сборке Microsoft.SharePoint, которые не начинаются с данного префикса, представляют элементы управления веб-формы.

Обычно SharePoint Foundation не сохраняет изменения свойств объекта в базе данных, пока не будет вызван метод Update заданного объекта. В следующем примере показано, как изменить заголовок и описание списка задач.

         
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();
ПримечаниеПримечание

Метаданные для документа нельзя изменить с помощью метода Update() объекта SPListItem, если документ извлекается из библиотеки документов.

Коллекции

Как списки находятся в центре сайта SharePoint, так и коллекции находятся в центре его объектных моделей. Каждую из коллекций можно использовать для добавления, удаления, перечисления и обновления типа объекта. Для классов коллекций обычно характерны следующие признаки.

  • Имеет имя, заканчивающееся на слово "Collection".

  • Реализует интерфейс System.Collections.ICollection.

  • Имеет свойство Count типа Int32.

  • Имеет индексатор Int32, который можно использовать для получения nth элемента в коллекции.

  • Имеет индексатор, принимающий идентификатор элемента.

  • Имеет методы Add и Delete.

При вызове метода Add для коллекции обычно выполняется обновление базы данных на фоновом сервере соответствующими данными, кроме ситуации, когда для обновления данных требуются дополнительные сведения. В этом случае при использовании метода Add возвращается объект, который можно использовать для сбора необходимых сведений. Например, чтобы добавить элемент в список, сначала воспользуйтесь методом Add класса Microsoft.SharePoint.SPListItemCollection, чтобы возвратить объект SPListItem, назначьте значения соответствующим свойствам объекта, а затем вызовите метод Updateдля применения изменений в базе данных контента.

Индексаторы

Индексаторы удобно использовать для доступа к отдельным элементам в коллекциях. Чтобы возвратить элемент, воспользуйтесь квадратными скобками ([]) в Microsoft C# или круглыми скобками (()) в Microsoft Visual Basic для указания индекса или строки, идентифицирующих элемент внутри коллекции.

Например, если oWebsite представляет экземпляр класса SPWeb, то SPList oList = oWebsite.Lists["Announcements"] возвращает список извещений в C#, а Dim oList As SPList = oWebsite.Lists("Announcements") возвращает этот список в Visual Basic.

Для возврата элементов из списка рекомендуется вызывать один из методов GetItem* объекта списка и указывать элементы для извлечения. Если для извлечения всех элементов списка используется свойство Items, это может отрицательно сказаться на производительности, поскольку в этом случае принудительно возвращаются все столбцы для всех элементов. Вместо этого можно использовать, например, метод GetItems и передать в него объект SPQuery, определяющий подмножество данных: SPListItemCollection collItem = oList.GetItems(oQuery) (в Visual Basic, Dim collItem As SPListItemCollection = oList.GetItems(oQuery)).

После возврата коллекции элементов из списка с помощью метода GetItem* можно указать имя поля, которое будет использоваться в качестве индексатора и выполнить итерацию по коллекции элементов в списке для возврата значений из поля. В данном примере для каждого элемента в списке отображаются значения "Due Date", "Status" и "Title".

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>");
}
ПримечаниеПримечание

Кроме директивы using (Imports в Visual Basic) для пространства имен Microsoft.SharePoint, в предыдущем примере требуется директива для пространства имен Microsoft.SharePoint.Utilities.

В следующем примере показано, как возвратить все значения "Title" и "Status" из списка задач на веб-сайте 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>");
}

Если реализовано регулирование запросов, неэффективные запросы могут блокироваться из-за слишком большого числа подстановок или элементов. Чтобы повысить эффективность запроса и уменьшить число подстановок, можно определить объект SPQuery, который определяет ограниченный набор полей представления (ViewFields), а затем передать этот объект запроса в метод 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.

ПримечаниеПримечание

Кроме директивы using (Imports в Visual Basic) для пространства имен Microsoft.SharePoint, в предыдущем примере требуется директива для пространства имен 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) возвращается элемент, а затем задаются значения столбцов "Status" и "Title" этого элемента.

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

Получение ссылок на сайты, веб-приложения и другие ключевые объекты

Регистрация и импорт пространств имен