Класс 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) этого типа являются потокобезопасными. Не гарантируется, что любые элементы экземпляров потокобезопасны.

См. также

Справочные материалы

Элементы SPFieldLookup

Пространство имен Microsoft.SharePoint

GetRelatedFields()

SPRelatedField

SPRelationshipDeleteBehavior