Работа с объектами 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.Administration
Концепции
Возвращение элементов из списка
Добавление и удаление элементов списка
Практическое руководство. Чтение значения поля в элементе списка
Пространства имен в объектной модели SharePoint Foundation
Использование Visual Studio для разработки SharePoint
Получение ссылок на сайты, веб-приложения и другие ключевые объекты