Класс SPFieldLookup
Представляет поле подстановки.
Иерархия наследования
System.Object
Microsoft.SharePoint.SPField
Microsoft.SharePoint.SPFieldLookup
Microsoft.SharePoint.Applications.GroupBoard.SPFieldFacilities
Microsoft.SharePoint.SPFieldUser
Пространство имен: Microsoft.SharePoint
Сборка: Microsoft.SharePoint (в Microsoft.SharePoint.dll)
Синтаксис
'Декларация
Public Class SPFieldLookup _
Inherits SPField
'Применение
Dim instance As SPFieldLookup
public class SPFieldLookup : SPField
Замечания
Подстановочное поле получает значение из поля в другом списке. Список, который предоставляет данные для поля подстановок, называется список подстановок. Чтобы получить ссылку на список подстановок, доступ к свойству LookupList объекта SPFieldLookup . Чтобы определить, какое поле в списке поиска предоставляет сведения, доступ к свойству LookupField .
Примечание
Класс SPFieldLookup соответствует Lookup тип данных, указанный в декларативном XML с помощью атрибута Type элемента Field . Атрибут List элемента Field соответствует свойство LookupList класса SPFieldLookup .
Несмотря на то, что класс SPFieldLookup содержит конструктор, часто бывает более удобно для вызова метода AddLookup класса SPFieldCollection . Метод AddLookup имеет перегрузку, которая можно использовать для создания поиска в список в другом веб-узле от того, где создается объект SPFieldLookup .
Microsoft SharePoint Foundation поддерживает несколько столбцов подстановки. В этом случае столбец первичного устанавливает связь со списком подстановок, выбрав в поле в конечном списке и выберите один или несколько дополнительных столбцов на другие поля в конечном списке. Можно создать поле подстановки для дополнительного столбца путем вызова метода AddDependentLookup класса SPFieldCollection . Для дополнительного столбца свойство IsDependentLookup возвращает true. IsDependentLookup возвращает false столбцом первичного и свойство IsRelationship возвращает true.
SharePoint Foundation поддерживает целостность данных для элементов списка, делая возможным для поля подстановки задать ограничения удаления в списке поиска. Для этого через свойство RelationshipDeleteBehavior , которое принимает одно из следующих значений перечисления SPRelationshipDeleteBehavior :
Cascade. Удаление элемента из списка подстановки приводит все связанные элементы для удаления из списка, который содержит поле подстановок.
Restrict. Запрещает удаляется, если существуют связанные элементы в списке, содержащем подстановочное поле элемента в списке поиска.
None. Без ограничения (по умолчанию).
Чтобы указать Cascade или Restrict, пользователь должен иметь SPBasePermissions.ManageLists разрешение на список подстановок. Кроме того Cascade и Restrict требуется индексировать поля подстановки. Перед для свойства RelationshipDeleteBehavior значение любого из этих значений, сначала присвойте свойству Indexed значение true.
Примечание
Не удается задать ограничение удаления полем поиска, которое допускает несколько значений, а также возможна Если список подстановок в другой веб-узел.
В SharePoint Foundationполей поиска в связанный список, видимые в списке подстановки (цель поиска) через метод GetRelatedFields() класса SPList . Метод GetRelatedFields имеет перегрузку, которая позволяет отфильтровать поля подстановок, задать ограничение удаления определенной.
Lookup Field Values
По умолчанию поле подстановки содержит только одно значение. В этом случае значение поля — объект типа String, а строка имеет следующий формат:
Id;#Value
Идентификатор — это идентификатор элемента списка, который указывает поле подстановки. Значением является значение поля, которое указывает поле подстановки. Эти две части строки, разделенные знаками ";#". Если значение содержит точку с запятой (";"), преобразуются в точки с запятой («; ").
Например если поле подстановки указывает на третий элемент списка и поля, поля подстановки указывает на значение — "я способных на старые шины; возвращается он повышает Мои jaw", а затем следующую строку:
3;#I gnaw on old tires;;it strengthens my jaw
Проанализировать эту строку самостоятельно, или передать в качестве аргумента в конструктор для объекта SPFieldLookupValue . Идентификатор элемента списка можно получить из свойства LookupId объекта SPFieldLookupValue , а значение поля в элементе списка из свойства LookupValue .
Поле подстановок может иметь несколько значений, если свойство AllowMultipleValues возвращает true. В этом случае значение поля является объектом типа SPFieldLookupValueCollection , как Objectв штучной упаковке. Все значения можно получить, сначала приведение значение SPFieldLookupValueCollection в поле raw, а затем SPFieldLookupValue объектов в коллекции.
Примечания для разработчиков производных классов
В SharePoint Foundationстолбцов в зависимости от пользовательских типов полей в режиме только для чтения.
Примеры
Следующий пример является консольным приложением, которое создает связь между списком клиентов и список отложенных заказов. Приложение вызывает метод AddLookup для добавления является первичным полем подстановки с именем Customer ID списка ожидающих заказов и указывает поле в поле ID в списке клиентов. Новое поле Customer ID индексированных и установить ограничения на удаление из списка подстановки.
После создания первичное поле подстановки, приложение создает три дополнительных поля с именем имя, Фамилия и телефонный. Приложение создает эти поля с помощью метода AddDependentLookup объекта, который представляет коллекцию полей списка ожидающих заказов.
using System;
using Microsoft.SharePoint;
namespace RelatedLists
{
class Program
{
static void Main(string[] args)
{
using (SPSite siteCollection = new SPSite("https://localhost"))
{
using (SPWeb site = siteCollection.OpenWeb())
{
SPList lookupList = site.Lists.TryGetList("Customers");
SPList relatedList = site.Lists.TryGetList("Pending Orders");
if (lookupList != null && relatedList != null)
{
// Create the primary column.
string strPrimaryCol = relatedList.Fields.AddLookup("Customer ID", lookupList.ID, true);
SPFieldLookup primaryCol = (SPFieldLookup)relatedList.Fields.GetFieldByInternalName(strPrimaryCol);
primaryCol.LookupField = lookupList.Fields["ID"].InternalName;
primaryCol.Indexed = true;
primaryCol.RelationshipDeleteBehavior = SPRelationshipDeleteBehavior.Restrict;
primaryCol.Update();
// Create the secondary columns.
string strFirstNameCol = relatedList.Fields.AddDependentLookup("First Name", primaryCol.Id);
SPFieldLookup firstNameCol = (SPFieldLookup)relatedList.Fields.GetFieldByInternalName(strFirstNameCol);
firstNameCol.LookupField = lookupList.Fields["First Name"].InternalName;
firstNameCol.Update();
string strLastNameCol = relatedList.Fields.AddDependentLookup("Last Name", primaryCol.Id);
SPFieldLookup lastNameCol = (SPFieldLookup)relatedList.Fields.GetFieldByInternalName(strLastNameCol);
lastNameCol.LookupField = lookupList.Fields["Last Name"].InternalName;
lastNameCol.Update();
string strPhoneCol = relatedList.Fields.AddDependentLookup("Phone", primaryCol.Id);
SPFieldLookup phoneCol = (SPFieldLookup)relatedList.Fields.GetFieldByInternalName(strPhoneCol);
phoneCol.LookupField = lookupList.Fields["Phone"].InternalName;
phoneCol.Update();
}
}
}
Console.Write("\nPress ENTER to continue...");
Console.ReadLine();
}
}
}
Imports System
Imports Microsoft.SharePoint
Module ConsoleApp
Sub Main()
Using siteCollection As New SPSite("https://localhost")
Using site As SPWeb = siteCollection.OpenWeb()
Dim lookupList As SPList = site.Lists.TryGetList("Customers")
Dim relatedList As SPList = site.Lists.TryGetList("Pending Orders")
If lookupList IsNot Nothing AndAlso relatedList IsNot Nothing Then
' Create the primary column.
Dim strPrimaryCol As String = relatedList.Fields.AddLookup("Customer ID", lookupList.ID, True)
Dim primaryCol As SPFieldLookup = _
DirectCast(relatedList.Fields.GetFieldByInternalName(strPrimaryCol), SPFieldLookup)
primaryCol.LookupField = lookupList.Fields("ID").InternalName
primaryCol.Indexed = True
primaryCol.RelationshipDeleteBehavior = SPRelationshipDeleteBehavior.Restrict
primaryCol.Update()
' Create the secondary columns.
Dim strFirstNameCol As String = relatedList.Fields.AddDependentLookup("First Name", primaryCol.Id)
Dim firstNameCol As SPFieldLookup = _
DirectCast(relatedList.Fields.GetFieldByInternalName(strFirstNameCol), SPFieldLookup)
firstNameCol.LookupField = lookupList.Fields("First Name").InternalName
firstNameCol.Update()
Dim strLastNameCol As String = relatedList.Fields.AddDependentLookup("Last Name", primaryCol.Id)
Dim lastNameCol As SPFieldLookup = _
DirectCast(relatedList.Fields.GetFieldByInternalName(strLastNameCol), SPFieldLookup)
lastNameCol.LookupField = lookupList.Fields("Last Name").InternalName
lastNameCol.Update()
Dim strPhoneCol As String = relatedList.Fields.AddDependentLookup("Phone", primaryCol.Id)
Dim phoneCol As SPFieldLookup = _
DirectCast(relatedList.Fields.GetFieldByInternalName(strPhoneCol), SPFieldLookup)
phoneCol.LookupField = lookupList.Fields("Phone").InternalName
phoneCol.Update()
End If
End Using
End Using
Console.Write(vbLf & "Press ENTER to continue...")
Console.ReadLine()
End Sub
End Module
В следующем примере демонстрируется, как интерпретировать значение поля подстановки.
В примере кода выполняется поиск списка вопросов в корневом веб-узле семейства веб-сайтов. Тип списка проблем выбирается здесь, так как она содержит несколько полей подстановок. Пример можно изменить, выбрав другой тип списка. Найден список, в примере выбирается первое поле подстановки, он находит в коллекцию полей списка. Затем код выполняет итерацию элементов списка, печати сведения о значении каждого элемента поля подстановки.
using System;
using Microsoft.SharePoint;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
using (SPSite site = new SPSite("https://localhost"))
{
using (SPWeb web = site.RootWeb)
{
SPList list = null;
foreach (SPList webList in web.Lists)
{
if (webList.BaseType == SPBaseType.Issue)
{
list = webList;
break;
}
}
if (list != null)
{
Guid fieldId = Guid.Empty;
foreach (SPField field in list.Fields)
{
if (field is SPFieldLookup)
{
fieldId = field.Id;
break;
}
}
if (fieldId != Guid.Empty)
{
SPFieldLookup lookupField = list.Fields[fieldId] as SPFieldLookup;
Console.WriteLine("Lookup field: {0}", lookupField.Title);
foreach (SPListItem item in list.Items)
{
object rawValue = item[fieldId];
if (rawValue != null)
{
Console.WriteLine("\nItem: {0}. {1}", item.ID, item.Title);
Console.WriteLine("Raw value: {0}", rawValue);
if (lookupField.AllowMultipleValues)
{
SPFieldLookupValueCollection values = item[fieldId] as SPFieldLookupValueCollection;
foreach (SPFieldLookupValue value in values)
{
PrintValue(value);
}
}
else
{
SPFieldLookupValue value = new SPFieldLookupValue(rawValue.ToString());
PrintValue(value);
}
}
}
}
}
}
}
Console.Write("\nPress ENTER to continue...");
Console.ReadLine();
}
public static void PrintValue(SPFieldLookupValue value)
{
Console.WriteLine("Lookup item ID: {0}", value.LookupId);
Console.WriteLine("Lookup item value: {0}", value.LookupValue);
}
}
}
Imports System
Imports Microsoft.SharePoint
Module ConsoleApp
Sub Main(ByVal args As String())
Using site As New SPSite("https://localhost")
Using web As SPWeb = site.RootWeb
Dim list As SPList = Nothing
For Each webList As SPList In web.Lists
If webList.BaseType = SPBaseType.Issue Then
list = webList
Exit For
End If
Next
If list <> Nothing Then
Dim fieldId As Guid = Guid.Empty
For Each field As SPField In list.Fields
If TypeOf field Is SPFieldLookup Then
fieldId = field.Id
Exit For
End If
Next
If fieldId <> Guid.Empty Then
Dim lookupField As SPFieldLookup = TryCast(list.Fields(fieldId), SPFieldLookup)
Console.WriteLine("Lookup field: {0}", lookupField.Title)
For Each item As SPListItem In list.Items
Dim rawValue As Object = item(fieldId)
If rawValue <> Nothing Then
Console.WriteLine(vbLf & "Item: {0}. {1}", item.ID, item.Title)
Console.WriteLine("Raw value: {0}", rawValue)
If lookupField.AllowMultipleValues Then
Dim values As SPFieldLookupValueCollection = TryCast(item(fieldId), _
SPFieldLookupValueCollection)
For Each value As SPFieldLookupValue In values
PrintValue(value)
Next
Else
Dim value As New SPFieldLookupValue(rawValue.ToString())
PrintValue(value)
End If
End If
Next
End If
End If
End Using
End Using
Console.Write(vbLf & "Press ENTER to continue...")
Console.ReadLine()
End Sub
Sub PrintValue(ByVal value As SPFieldLookupValue)
Console.WriteLine("Lookup item ID: {0}", value.LookupId)
Console.WriteLine("Lookup item value: {0}", value.LookupValue)
End Sub
End Module
Потокобезопасность
Любые общедоступные элементы static (Shared в Visual Basic) этого типа являются потокобезопасными. Не гарантируется, что любые элементы экземпляров потокобезопасны.