Clase SPFieldLookup

Representa un campo de búsqueda.

Jerarquía de la herencia

System.Object
  Microsoft.SharePoint.SPField
    Microsoft.SharePoint.SPFieldLookup
      Microsoft.SharePoint.Applications.GroupBoard.SPFieldFacilities
      Microsoft.SharePoint.SPFieldUser

Espacio de nombres:  Microsoft.SharePoint
Ensamblado:  Microsoft.SharePoint (en Microsoft.SharePoint.dll)

Sintaxis

'Declaración
Public Class SPFieldLookup _
    Inherits SPField
'Uso
Dim instance As SPFieldLookup
public class SPFieldLookup : SPField

Comentarios

Un campo de búsqueda toma su valor de un campo de otra lista. La lista que proporciona datos para el campo de búsqueda se denomina la lista de búsqueda. Para obtener una referencia a la lista de búsqueda, tener acceso a la SPFieldLookup propiedad del objeto LookupList . Para determinar qué campo de la lista de búsqueda consiste en proporcionar información, obtener acceso a la propiedad LookupField .

Nota

La clase SPFieldLookup corresponde al tipo de datos Lookup que se especifica en XML declarativo a través del atributo Type del elemento Field . El atributo List del elemento Field corresponde a la propiedad LookupList de la clase SPFieldLookup .

Aunque la clase SPFieldLookup tiene un constructor, a menudo es más conveniente llamar al método AddLookup de la clase SPFieldCollection . El método AddLookup tiene una sobrecarga que puede usar para crear una búsqueda a una lista en un sitio Web distinto del que está creando el objeto SPFieldLookup .

Microsoft SharePoint Foundation admite búsquedas en varias columnas. En este caso, una columna principal establece la relación con la lista de búsqueda apuntando a un campo en la lista de destino y, a continuación, elija una o más columnas secundario a otros campos en la lista de destino. Puede crear el campo de búsqueda para una columna secundaria llamando al método AddDependentLookup de la clase SPFieldCollection . Para una columna secundaria, la propiedad IsDependentLookup devuelve true. Para una columna principal, IsDependentLookup devuelve false y la propiedad IsRelationship devuelve true.

SharePoint Foundation admite la integridad referencial para elementos de lista, ya que permite para campos de búsqueda establecer restricciones de eliminación en la lista de búsqueda. Para ello, a través de la propiedad RelationshipDeleteBehavior , que toma uno de los siguientes valores de enumeración de SPRelationshipDeleteBehavior :

  • Cascade. Eliminación de un elemento de la lista de búsqueda, hace que todos los elementos relacionados que se eliminará de la lista que contiene el campo de búsqueda.

  • Restrict. Impide que un elemento en la lista de búsqueda de se elimine si existen elementos relacionados en la lista que contiene el campo de búsqueda.

  • None. No hay restricción (predeterminado).

Para especificar Cascade o Restrict, el usuario debe tener SPBasePermissions.permiso de ManageLists en la lista de búsqueda. Además, Cascade y Restrict requieren que el campo de búsqueda se pueden indizar. Antes de establecer la propiedad RelationshipDeleteBehavior en cualquiera de estos valores, en primer lugar, establezca la propiedad de Indexed a true.

Nota

No se puede establecer una restricción de eliminación en un campo de búsqueda que permite varios valores, ni es posible si la lista de búsqueda se encuentra en otro sitio Web.

En SharePoint Foundation, campos de búsqueda en una lista relacionada son accesibles desde la lista de búsqueda (el destino de la búsqueda) a través del método GetRelatedFields() de la clase SPList . El método GetRelatedFields tiene una sobrecarga que le permite filtrar los campos de búsqueda que especifican una restricción de eliminación determinada.

Lookup Field Values

De forma predeterminada, un campo de búsqueda contiene un solo valor. En este caso, el valor del campo es un objeto de tipo String, y la cadena tiene el formato siguiente:

Id;#Value

ID es el identificador del elemento de lista que señale el campo de búsqueda. Valor es el valor del campo que señale el campo de búsqueda. Las dos partes de la cadena están delimitadas por los caracteres ";#". Si el valor contiene un punto y coma (";"), es un carácter de escape con un punto y coma (";").

Por ejemplo, si el campo de búsqueda señala el tercer elemento de lista y el valor del campo que señale el campo de búsqueda es "gnaw neumáticos anterior; se devuelve refuerzan mi masticadores", a continuación, la siguiente cadena:

3;#I gnaw on old tires;;it strengthens my jaw

Puede analizar esta cadena, o puede pasar como un argumento al constructor para un objeto SPFieldLookupValue . Puede obtener el identificador de elemento de lista de la propiedad LookupId de un objeto SPFieldLookupValue y el valor del campo en el elemento de lista de la propiedad LookupValue .

Un campo de búsqueda puede tener varios valores, si la propiedad AllowMultipleValues devuelve true. En este caso, el valor del campo es un objeto del tipo SPFieldLookupValueCollection que está en la caja como Object. Puede obtener todos los valores convirtiendo en primer lugar el valor del campo sin procesar a SPFieldLookupValueCollection y, a continuación, enumerar los objetos SPFieldLookupValue de la colección.

Notas para los desarrolladores de herederos

En SharePoint Foundation, las columnas basadas en tipos de campo personalizados son de sólo lectura en la vista Hoja de datos.

Ejemplos

En el siguiente ejemplo es una aplicación de consola que crea una relación entre la lista de clientes y la lista de pedidos pendientes. La aplicación llama al método AddLookup para agregar un campo de búsqueda principal denominado ID de cliente a la lista de pedidos pendientes y señala el campo en el campo de identificador en la lista de los clientes. El nuevo campo de ID de cliente se indizan y establecer para restringir los elementos eliminados de la lista de búsqueda.

Después de crear el campo de búsqueda principal, la aplicación crea tres campos secundarios denominados nombre, apellidos y teléfono. La aplicación crea estos campos llamando al método AddDependentLookup del objeto que representa la colección de campos de la lista de pedidos pendientes.

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

En el siguiente ejemplo se muestra cómo interpretar el valor de un campo de búsqueda.

El código de ejemplo se busca una lista de problemas en el sitio Web raíz de una colección de sitios. El tipo de lista de problemas se elige aquí porque tiene varios campos de búsqueda. Puede modificar el ejemplo mediante la selección de otro tipo de lista. Tener encuentra una lista, en el ejemplo se selecciona el primer campo de búsqueda que se encuentre en la colección de campos de la lista. A continuación, el código recorre los elementos de lista, imprimir información sobre el valor de cada elemento campo de búsqueda.

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

Seguridad para subprocesos

Los miembros static (Shared en Visual Basic) públicos de este tipo son seguros para subprocesos. No se garantiza que los miembros de instancias sean seguros para los subprocesos.

Vea también

Referencia

Miembros SPFieldLookup

Espacio de nombres Microsoft.SharePoint

GetRelatedFields()

SPRelatedField

SPRelationshipDeleteBehavior