Nachschlagevorgänge und Listenbeziehungen

Letzte Änderung: Mittwoch, 1. Dezember 2010

Gilt für: SharePoint Foundation 2010

Inhalt dieses Artikels
Listenbeziehungen und Datenintegrität
Erstellen einer Listenbeziehung
Erstellen von mehrspaltigen Nachschlagevorgängen
Erkennen von Listenbeziehungen
Erkennen von verwandten Elementen

In Microsoft SharePoint Foundation ist ein Nachschlagefeld so konfiguriert, dass es seinen Wert aus einem Feld in einer anderen Liste abruft. Beim Hinzufügen eines Nachschlagefelds zu einer Liste wird eine Beziehung zwischen dieser Liste und der Liste erstellt, die die Daten bereitstellt.

Die Art des Verweises auf die beiden Listen hängt von Ihrem Standpunkt ab. Aus der Sicht des Nachschlagefelds ist die Liste, die die Daten bereitstellt, die Zielliste, und das Feld, aus dem die Daten stammen, ist das Zielfeld. Aus der Sicht der Zielliste ist die Liste, die das Nachschlagefeld enthält, eine verwandte Liste. Das Nachschlagefeld selbst ist ein verwandtes Feld.

TippTipp

Die SPList-Klasse besitzt eine GetRelatedFields-Methode, mit der Sie Nachschlagefelder erkennen können, die auf eine Liste zeigen.

Aus Gründen der Einfachheit und Eindeutigkeit wird manchmal davon gesprochen, dass die beiden Listen eine Beziehung zwischen übergeordneten und untergeordneten Elementen besitzen. Die untergeordnete Liste enthält das Nachschlagefeld. Die übergeordnete Liste enthält die Datenquelle, also das Feld, das das Ziel des Nachschlagefelds ist.

Listenbeziehungen und Datenintegrität

In Microsoft SharePoint Foundation 2010 können Sie ein Nachschlagefeld in einer untergeordneten Liste so konfigurieren, dass eine Löschungseinschränkung in Elementen in der übergeordneten Liste platziert wird. Wenn Sie eine Nachschlagespalte über die Benutzeroberfläche erstellen oder bearbeiten, können Sie die Option Verhalten für Beziehung erzwingen auswählen. Wenn Sie diese Option auswählen, können Sie entweder Löschbeschränkung oder Löschweitergabe auswählen. Mit Löschbeschränkung wird verhindert, dass ein Element in der übergeordneten Liste gelöscht wird, falls mindestens ein verwandtes Element in der untergeordneten Liste darauf verweist. Mit Löschweitergabe werden beim Löschen eines Elements aus der übergeordneten Liste auch alle verwandten Elemente aus der untergeordneten Liste gelöscht.

Wenn Sie dasselbe Verhalten im Code aktivieren möchten, legen Sie die RelationshipDeleteBehavior-Eigenschaft eines SPFieldLookup-Objekts auf einen Wert in der SPRelationshipDeleteBehavior-Enumeration fest, entweder Restrict oder Cascade.

Wichtiger HinweisWichtig

Wenn die Löschungen von SharePoint Foundation entweder eingeschränkt oder weitergegeben werden sollen, muss das Nachschlagefeld indiziert sein. Legen Sie die Indexed-Eigenschaft des Felds auf true fest.

Der Zweck der Löschungseinschränkung liegt darin, dass die referenzielle Integrität erzwungen werden soll. Die Einschränkung wird angewendet, wenn Sie verhindern möchten, dass ein Element mit einem Nachschlagefeld verwaist, indem es auf ein nicht vorhandenes Element in der Zielliste zeigt.

Ein Beispiel: Angenommen, Sie haben zwei Listen, Customers und Addresses. Sie verbinden die beiden Listen, indem Sie der Liste Addresses ein Nachschlagefeld mit dem Namen Customer ID hinzufügen und das Nachschlagefeld auf das ID-Feld in der Liste Customers zeigen lassen. Nachdem Sie das Nachschlagen konfiguriert haben, platzieren Sie eine Einschränkung in der Beziehung zwischen den beiden Listen, indem Sie angeben, dass Löschungen aus der Liste Customers an die Liste Addresses weitergegeben werden müssen. Durch das Weitergeben der Löschungen wird die referenzielle Integrität erzwungen, indem sichergestellt wird, dass die Liste Addresses keine verwaisten Adressen erfasst. Immer, wenn ein Element aus Customers gelöscht wird, werden verwandte Elemente automatisch aus Addresses gelöscht.

Angenommen, Sie besitzen auch eine Liste Pending Orders, die wie Addresses auch mit der Liste Customers über ein Nachschlagefeld verbunden ist, das auf das ID-Feld in Customers zeigt. Möglicherweise möchten Sie nicht, dass ein Kundendatensatz aus der Liste Customers gelöscht wird, wenn für den Kunden noch eine ausstehende Bestellung in der Liste Pending Orders vorhanden ist. In diesem Fall könnten Sie die referenzielle Integrität erzwingen, indem Sie das Nachschlagefeld in Pending Orders so konfigurieren, dass Löschungen aus der übergeordneten Liste Customers eingeschränkt sind.

Ein Nebeneffekt des Weitergebens oder Einschränkens von Löschungen besteht darin, dass die Werte der Nachschlagefelder überprüft werden, wenn sie festgelegt werden. Wenn ein Benutzer ein neues Element über die Benutzeroberfläche erstellt, wird die Nachschlagespalte im Formular durch eine Dropdownliste dargestellt, falls die Zielliste weniger als 20 Elemente enthält. In diesem Fall kann der Benutzer nur gültige Werte auswählen. Falls das Ziel mehr als 20 Elemente enthält, wird ein anderes Steuerelement verwendet, und der Benutzer muss einen Wert eingeben. In diesem Fall führt das Eingeben eines ungültigen Werts zu einem roten Überprüfungstext im Formular. Eine ähnliche Überprüfung erfolgt, wenn Sie das Objektmodell zum Festlegen des Werts eines Nachschlagefelds verwenden. Wenn in diesem Fall der angegebene Wert nicht auf ein vorhandenes Element in der Zielliste zeigt, gibt SharePoint Foundation eine Ausnahme aus.

Sie können sich auch dafür entscheiden, keine Löschungseinschränkung in der Nachschlageliste zu platzieren. Zusätzlich zu Addresses und Pending Orders kann beispielsweise eine Complete Orders-Liste vorhanden sein, die wie die anderen verwandten Listen auf das ID-Feld in der Customers-Liste zeigt. Vielleicht möchten Sie einen Datensatz zu jeder abgeschlossenen Bestellung aufbewahren, auch wenn für den Kunden, der diese Bestellung aufgegeben hat, kein Datensatz mehr aufbewahrt wird. Die referenzielle Integrität ist hier kein Problem, sodass Sie keine Einschränkung für Löschungen aus der Nachschlageliste angeben. In diesem Fall wirkt sich das Löschen eines Elements aus der Customers-Liste nicht auf die Complete Orders-Liste aus.

Erstellen einer Listenbeziehung

Ein Nachschlagefeld wird durch eine Instanz der SPFieldLookup-Klasse dargestellt. Die Klasse enthält Konstruktoren, die einfachste Möglichkeit zum Erstellen eines Nachschlagefelds besteht jedoch darin, die AddLookup-Methode der SPFieldCollection-Klasse aufzurufen. Die AddLookup-Methode besitzt eine Überladung, die Ihnen das Erstellen eines Nachschlagevorgangs in einer Liste auf einer anderen Website erlaubt als die Website, auf der Sie den Nachschlagevorgang erstellen.

HinweisHinweis

Sie können eine Beziehung zwischen Listen auf unterschiedlichen Websites erstellen, für die Beziehung kann jedoch kein einschränkendes Verhalten festgelegt werden. Die referenzielle Integrität wird bei websiteübergreifenden Nachschlagevorgängen nicht von SharePoint Foundation erzwungen.

So fügen Sie einer Liste eine Nachschlagespalte hinzu

  1. Rufen Sie einen Verweis auf die Feldauflistung der Liste ab, indem Sie auf ihre Fields-Eigenschaft zugreifen.

  2. Rufen Sie die AddLookup-Methode des SPFieldCollection-Objekts auf, wobei der ID-Wert der Nachschlageliste (der Datenquelle) im zweiten Parameter übergeben wird.

    Die AddLookup-Methode gibt eine Zeichenfolge mit dem internen Namen des neuen Felds zurück.

  3. Rufen Sie einen Verweis auf das SPFieldLookup-Objekt ab, das das neue Feld darstellt, indem Sie die GetFieldByInternalName-Methode aufrufen, wobei die durch die AddLookup-Methode zurückgegebene Zeichenfolge als Argument übergeben wird.

    Die GetFieldByInternalName-Methode gibt ein SPField-Objekt zurück, das Sie zum Typ SPFieldLookup umwandeln müssen.

  4. Legen Sie die LookupField-Eigenschaft auf den internen Namen des Felds in der Nachschlageliste fest, die das SPFieldLookup-Objekt als Datenquelle verwenden soll.

    Das Ziel der LookupField-Eigenschaft muss eines der folgenden Feldtypen sein:

    Darüber hinaus kann das Ziel vom Typ SPFieldCalculated sein, wenn Text ausgegeben wird. Weitere Informationen finden Sie in der OutputType-Eigenschaft. Das Ziel kann vom Typ SPFieldComputed sein, wenn Nachschlagevorgänge für das Feld aktiviert sind. Weitere Informationen finden Sie in der EnableLookup-Eigenschaft.

  5. (Optional) Wenn Sie ein anderes Löschungsverhalten angeben möchten als None (den Standardwert), legen Sie die Indexed-Eigenschaft auf true fest.

  6. (Optional) Legen Sie die RelationshipDeleteBehavior-Eigenschaft mit einem SPRelationshipDeleteBehavior-Enumerationswert fest.

    Wichtiger HinweisWichtig

    Der Benutzer muss über die ManageLists-Berechtigung in der Nachschlageliste verfügen, um entweder Cascade oder Restrict anzugeben. Weitere Informationen finden Sie in der SPBasePermissions-Enumeration.

    Zudem tritt beim Festlegen eines Beziehungsverhaltens in folgenden Fällen ein Fehler auf:

    • Das Nachschlagefeld lässt mehrere Werte zu.

      Stellen Sie vor dem Festlegen der RelationshipDeleteBehavior-Eigenschaft sicher, dass die AllowMultipleValues-Eigenschaft false zurückgibt.

    • Vorhandene Listenelemente enthalten ungültige Werte für das Nachschlagefeld.

      Dies kann vorkommen, wenn die RelationshipDeleteBehavior-Eigenschaft des Nachschlagefelds zuvor auf None festgelegt war und ein Benutzer das Element in der Zielliste gelöscht hat, auf die das Nachschlagefeld zeigt. Das Nachschlagefeld ist dann verwaist. Es enthält einen ungültigen Wert. Ein Beziehungsverhalten kann nicht erzwungen werden, wenn die Liste verwaiste Nachschlagefelder enthält.

    • Das Nachschlagefeld zeigt auf eine Liste auf einer anderen Website.

      Überprüfen Sie den Wert der LookupWebId-Eigenschaft des Nachschlagefelds.

    • Die Anzahl von Elementen in der Liste übersteigt das für umfangreiche Listen festgelegte Maximum.

      Vergleichen Sie den von der ItemCount-Eigenschaft der Liste zurückgegebenen Wert mit dem Wert, den die MaxItemsPerThrottledOperation-Eigenschaft der Webanwendung zurückgibt.

  7. Rufen Sie die Update-Methode auf, um ein Commit für Änderungen am Objekt auszuführen.

Beispiel

Das folgende Beispiel zeigt eine Konsolenanwendung, die eine Beziehung zwischen der Liste Customers und der Liste Pending Orders herstellt. Die Anwendung ruft die AddLookup-Methode auf, um das Nachschlagefeld Customer ID der Liste Pending Orders hinzuzufügen, und lässt das Feld auf das ID-Feld der Customers-Liste zeigen. Das neue Customer ID-Feld wird indiziert und so festgelegt, dass Löschungen aus der Nachschlageliste eingeschränkt sind.

using System;
using Microsoft.SharePoint;

namespace RelatedLists
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SPSite siteCollection = new SPSite("https://localhost"))
            {
                using (SPwebsite = siteCollection.OpenWeb())
                {
                    SPList lookupList = site.Lists.TryGetList("Customers");
                    SPList relatedList = site.Lists.TryGetList("Pending Orders");

                    if (lookupList != null && relatedList != null)
                    {
                        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();
                    }
                }
            }
            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
                    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()
                End If
            End Using
        End Using
        Console.Write(vbLf & "Press ENTER to continue...")
        Console.ReadLine()
    End Sub
End Module

Erstellen von mehrspaltigen Nachschlagevorgängen

In SharePoint Foundation 2010 können Sie mehrspaltige Nachschlagevorgänge für dieselbe Nachschlageliste erstellen. Ein Beispiel: Angenommen, Sie haben zwei Listen, Customers und Pending Orders. Sie erstellen eine Beziehung zwischen den Listen, indem Sie der Pending Orders-Liste eine Customer ID-Spalte hinzufügen und die Spalte auf das ID-Feld in der Customers-Liste zeigen lassen. Wenn Sie Elemente in der Pending Orders-Liste anzeigen, sollen wichtige Informationen zum Kunden angezeigt werden, der die Bestellung aufgegeben hat, zusätzlich zu Informationen zur Bestellung selbst. Zur Lösung dieses Problems können Sie zusätzlich zur primären Nachschlagespalte, Customer ID, drei sekundäre Nachschlagespalten hinzufügen, um den Vornamen, Nachnamen und die Telefonnummer des Kunden anzuzeigen.

Sekundäre Spalten in einem mehrspaltigen Nachschlagevorgang hängen von der primären Spalte der Beziehung zur Nachschlageliste ab. Sie können keine Löschungseinschränkung in einer sekundären Nachschlagespalte einrichten. Die Einschränkung, die auf die primäre Spalte festgelegt wird, wird als einzige auf die Nachschlageliste angewendet.

Das Verfahren zum Erstellen einer sekundären Nachschlagespalte ist mit dem Erstellen einer primären Nachschlagespalte fast identisch. Der wichtigste Unterschied liegt darin, dass Sie das Feld durch Aufrufen der AddDependentLookup-Methode der SPFieldCollection-Klasse anstelle der AddLookup-Methode erstellen. Die AddDependentLookup-Methode hat zwei Parameter: den für das sekundäre Feld zu verwendenden Anzeigenamen und die ID des primären Felds.

Beispiel

Das folgende Beispiel zeigt eine Konsolenanwendung, die eine Beziehung zwischen der Liste Customers und der Liste Pending Orders herstellt. Die Anwendung ruft die AddLookup-Methode auf, um das primäre Nachschlagefeld Customer ID der Liste Pending Orders hinzuzufügen, und lässt das Feld auf das ID-Feld der Customers-Liste zeigen. Das neue Customer ID-Feld wird indiziert und so festgelegt, dass Löschungen aus der Nachschlageliste eingeschränkt sind.

Nachdem Sie das primäre Nachschlagefeld erstellt haben, werden drei sekundäre Felder mit den Namen First Name, Last Name und Phone von der Anwendung erstellt. Die Anwendung erstellt diese Felder durch Aufrufen der AddDependentLookup-Methode des Objekts, das die Felderauflistung der Liste Pending Orders darstellt.

using System;
using Microsoft.SharePoint;

namespace RelatedLists
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SPSite siteCollection = new SPSite("https://localhost"))
            {
                using (SPwebsite = 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

Erkennen von Listenbeziehungen

Sie können erkennen, welche Felder in verwandten Listen von Informationen in einer Nachschlageliste abhängen, indem Sie die GetRelatedFields-Methode in einem SPList-Objekt aufrufen, das die Nachschlageliste darstellt. Von der Methode wird eine Auflistung von SPRelatedField-Objekten mit den folgenden Eigenschaften zurückgegeben:

  • FieldId. Ruft den Id-Wert des Nachschlagefelds in der verwandten Liste ab.

  • ListId. Ruft den ID-Wert der verwandten Liste ab.

  • WebId. Ruft den ID-Wert der Website ab, auf der sich die verwandte Liste befindet.

  • RelationshipDeleteBehavior. Ruft die Löschungseinschränkung ab, die für die Beziehung definiert ist.

Die GetRelatedFields-Methode besitzt eine Überladung, die Ihnen das Abrufen von Informationen ausschließlich zu jenen Feldern erlaubt, die eine bestimmte Löschungseinschränkung angeben.

Es werden nur für verwandte Felder Informationen zurückgegeben, die die primäre Spalte in einem mehrspaltigen Nachschlagevorgang darstellen. Rufen Sie zum Anfordern von Informationen zu sekundären Spalten die GetDependentLookupInternalNames-Methode des SPFieldLookup-Objekts auf, das die primäre Spalte darstellt.

Beispiel

Das folgende Beispiel zeigt eine Konsolenanwendung, die Informationen zu Feldern in der Customers-Liste angibt, die Daten für Nachschlagefelder in anderen Listen bereitstellen. Für jedes verwandte Feld, das eine primäre Spalte darstellt, wird von der Anwendung die GetDependentLookupInternalNames-Methode aufgerufen, um eine Liste der Felder abzurufen, die sekundäre Spalten darstellen.

using System;
using System.Collections.Generic;
using Microsoft.SharePoint;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SPSite siteCollection = new SPSite("https://localhost"))
            {
                using (SPwebsite = siteCollection.OpenWeb())
                {
                    SPList targetList = site.Lists.TryGetList("Customers");
                    SPRelatedFieldCollection relatedFields = targetList.GetRelatedFields();

                    string strSeparator = new String('=', 70);
                    string strUnderline = new String('-', 20);
                    string strFormat = "Target Field: {0} | Related Field: {1}";

                    Console.WriteLine(strSeparator);
                    foreach (SPRelatedField fieldInfo in relatedFields)
                    {
                        using (SPWeb relatedSite = siteCollection.AllWebs[fieldInfo.WebId])
                        {
                            SPList relatedList = relatedSite.Lists.GetList(fieldInfo.ListId, false);
                            SPFieldLookup relatedField = relatedList.Fields[fieldInfo.FieldId] as SPFieldLookup;
                            SPField targetField = targetList.Fields.GetFieldByInternalName(relatedField.LookupField);

                            Console.WriteLine("\nTarget List: {0} ({1}) | Related List: {2} ({3})", targetList.Title, site.Title, relatedList.Title, relatedSite.Title);

                            Console.WriteLine("\nPrimary Column");
                            Console.WriteLine(strUnderline);
                            Console.WriteLine(strFormat, targetField.Title, relatedField.Title);
                            Console.WriteLine("Deletion behavior: {0}", relatedField.RelationshipDeleteBehavior);

                            Console.WriteLine("\nSecondary Columns");
                            Console.WriteLine(strUnderline);

                            List<string> dependents = relatedField.GetDependentLookupInternalNames();
                            for (int i = 0; i < dependents.Count; i++)
                            {
                                SPFieldLookup lookup = relatedList.Fields.GetFieldByInternalName(dependents[i]) as SPFieldLookup;
                                SPField field = targetList.Fields.GetFieldByInternalName(lookup.LookupField);

                                Console.WriteLine(strFormat, field.Title, lookup.Title);
                            }
                            Console.WriteLine();
                            Console.WriteLine(strSeparator);
                        }
                    }
                }
            }
            Console.Write("\nPress ENTER to continue...");
            Console.ReadLine();
        }
    }
}
Imports System
Imports System.Collections.Generic
Imports Microsoft.SharePoint

Module ConsoleApp

    Sub Main()
        Using siteCollection As New SPSite("https://localhost")
            Using site As SPWeb = siteCollection.OpenWeb()
                Dim targetList As SPList = site.Lists.TryGetList("Customers")
                Dim relatedFields As SPRelatedFieldCollection = targetList.GetRelatedFields()

                Dim strSeparator As String = New [String]("="c, 70)
                Dim strUnderline As String = New [String]("-"c, 20)
                Dim strFormat As String = "Target Field: {0} | Related Field: {1}"

                Console.WriteLine(strSeparator)
                For Each fieldInfo As SPRelatedField In relatedFields
                    Using relatedSite As SPWeb = siteCollection.AllWebs(fieldInfo.WebId)
                        Dim relatedList As SPList = relatedSite.Lists.GetList(fieldInfo.ListId, False)
                        Dim relatedField As SPFieldLookup = TryCast(relatedList.Fields(fieldInfo.FieldId), SPFieldLookup)
                        Dim targetField As SPField = targetList.Fields.GetFieldByInternalName(relatedField.LookupField)

                        Console.WriteLine(vbLf & "Target List: {0} ({1}) | Related List: {2} ({3})", _
                                          targetList.Title, site.Title, relatedList.Title, relatedSite.Title)

                        Console.WriteLine(vbLf & "Primary Column")
                        Console.WriteLine(strUnderline)
                        Console.WriteLine(strFormat, targetField.Title, relatedField.Title)
                        Console.WriteLine("Deletion behavior: {0}", relatedField.RelationshipDeleteBehavior)

                        Console.WriteLine(vbLf & "Secondary Columns")
                        Console.WriteLine(strUnderline)

                        Dim dependents As List(Of String) = relatedField.GetDependentLookupInternalNames()
                        Dim i As Integer = 0
                        While i < dependents.Count
                            Dim lookup As SPFieldLookup = _
                                TryCast(relatedList.Fields.GetFieldByInternalName(dependents(i)), SPFieldLookup)
                            Dim field As SPField = targetList.Fields.GetFieldByInternalName(lookup.LookupField)

                            Console.WriteLine(strFormat, field.Title, lookup.Title)
                            i = i + 1
                        End While
                        Console.WriteLine()
                        Console.WriteLine(strSeparator)
                    End Using
                Next
            End Using
        End Using
        Console.Write(vbLf & "Press ENTER to continue...")
        Console.ReadLine()
    End Sub
End Module

Die Konsolenanwendung druckt eine Ausgabe ähnlich wie im folgenden Beispiel aus.

======================================================================

Target List: Customers (Team Site) | Related List: Complete Orders (Team Site)

Primary Column
--------------------
Target Field: ID | Related Field: Customer ID
Deletion behavior: None

Secondary Columns
--------------------
Target Field: Last Name | Related Field: Customer

======================================================================

Target List: Customers (Team Site) | Related List: Addresses (Team Site)

Primary Column
--------------------
Target Field: ID | Related Field: Customer ID
Deletion behavior: Cascade

Secondary Columns
--------------------
Target Field: Last Name | Related Field: Last Name
Target Field: First Name | Related Field: First Name

======================================================================

Target List: Customers (Team Site) | Related List: Pending Orders (Team Site)

Primary Column
--------------------
Target Field: ID | Related Field: Customer ID
Deletion behavior: Restrict

Secondary Columns
--------------------
Target Field: First Name | Related Field: First Name
Target Field: Last Name | Related Field: Last Name
Target Field: Phone | Related Field: Phone

======================================================================

Press ENTER to continue...

Erkennen von verwandten Elementen

Die Benutzeroberfläche für SharePoint Foundation 2010 enthält auf dem Menüband eine Schaltfläche Verwandte Liste einfügen, mit der Benutzer die Seite, die eine Liste anzeigt, durch Hinzufügen eines verwandten Listenwebparts bearbeiten können. Das verwandte Listenwebpart zeigt Elemente in anderen Listen an, die mit dem ausgewählten Element in der aktuellen Liste verwandt sind. Sie können beispielsweise der Customers-Liste ein verwandtes Listenwebpart hinzufügen, sodass Benutzer einen Kundendatensatz auswählen können und Elemente in der verwandten Pending Orders-Liste anzeigen können, die zu dem ausgewählten Kunden gehören.

Dieselben Informationen zu verwandten Elementen können auch über das Objektmodell abgerufen werden, indem die Eigenschaften der SPRelatedField-Objekte verwendet werden, die durch einen Aufruf der GetRelatedFields-Methode des SPList-Objekts zurückgegeben werden, das die Nachschlageliste darstellt.

Beispiel

Das folgende Beispiel zeigt eine Konsolenanwendung, die ein Element aus der Customers-Liste abruft und verwandte Elemente in anderen Listen der Websitesammlung erkennt. Der Großteil der Arbeit wird von der PrintRelatedItems-Methode der Anwendung ausgeführt, die ein Element aus der Nachschlageliste und Informationen aus einem SPRelatedField-Objekt verwendet, um eine Abfrage in der verwandten Liste zu konstruieren.

using System;
using Microsoft.SharePoint;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SPSite siteCollection = new SPSite("https://localhost"))
            {
                using (SPwebsite = siteCollection.OpenWeb())
                {
                    int customerID = 1;

                    SPList list = site.Lists.TryGetList("Customers");
                    if (list != null)
                    {

                        // Get a customer record.
                        SPListItem customerRecord = null;
                        try
                        {
                            customerRecord = list.GetItemById(customerID);
                        }
                        catch (ArgumentException ex)
                        {
                            Console.WriteLine(ex.Message);
                        }

                        // Print related items.
                        if (customerRecord != null)
                        {
                            Console.WriteLine("Customer: {0} {1}", 
                            customerRecord[SPBuiltInFieldId.FirstName], customerRecord[SPBuiltInFieldId.Title]);

                            // Get related list items.
                            SPRelatedFieldCollection relatedFields = list.GetRelatedFields();
                            foreach (SPRelatedField fieldInfo in relatedFields)
                            {
                                using (SPWeb relatedSite = siteCollection.AllWebs[fieldInfo.WebId])
                                {
                                    PrintRelatedItems(customerRecord, relatedSite, fieldInfo);
                                }
                            }
                        }
                    }
                }
            }
            Console.Write("\nPress ENTER to continue...");
            Console.ReadLine();
        }

        static void PrintRelatedItems(SPListItem match, SPwebsite, SPRelatedField fieldInfo)
        {
            SPList targetList = fieldInfo.LookupList;
            SPList relatedList = site.Lists[fieldInfo.ListId];

            SPFieldLookup relatedField = relatedList.Fields[fieldInfo.FieldId] as SPFieldLookup;
            SPField targetField = targetList.Fields.GetFieldByInternalName(relatedField.LookupField);

            object value = match[targetField.Id];

            SPQuery q = new SPQuery();
            q.Query = string.Format(@"<Where>
                                            <Eq>
                                                <FieldRef Name=""{0}""/>
                                                <Value Type=""{1}"">{2}</Value>
                                            </Eq>
                                        </Where>", relatedField.InternalName, value.GetType(), value);

            SPListItemCollection items = relatedList.GetItems(q);

            if (items.Count > 0)
            {
                Console.WriteLine("\n{0} has {1} related items:", relatedList.Title, items.Count);
                foreach (SPListItem item in items)
                    Console.WriteLine(item.DisplayName);
            }
        }
    }
}
Imports System
Imports Microsoft.SharePoint

Module ConsoleApp

    Sub Main()
        Using siteCollection As New SPSite("https://localhost")
            Using site As SPWeb = siteCollection.OpenWeb()
                Dim customerID As Integer = 1

                Dim list As SPList = site.Lists.TryGetList("Customers")
                If list IsNot Nothing Then

                    ' Get a customer record.
                    Dim customerRecord As SPListItem = Nothing
                    Try
                        customerRecord = list.GetItemById(customerID)
                    Catch ex As ArgumentException
                        Console.WriteLine(ex.Message)
                    End Try

                    ' Print related items.
                    If customerRecord IsNot Nothing Then
                        Console.WriteLine("Customer: {0} {1}", _
                        customerRecord(SPBuiltInFieldId.FirstName), customerRecord(SPBuiltInFieldId.Title))

                        ' Get related list items.
                        Dim relatedFields As SPRelatedFieldCollection = list.GetRelatedFields()
                        For Each fieldInfo As SPRelatedField In relatedFields
                            Using relatedSite As SPWeb = siteCollection.AllWebs(fieldInfo.WebId)
                                PrintRelatedItems(customerRecord, relatedSite, fieldInfo)
                            End Using
                        Next
                    End If
                End If
            End Using
        End Using
        Console.Write(vbLf & "Press ENTER to continue...")
        Console.ReadLine()
    End Sub

    Sub PrintRelatedItems(ByVal match As SPListItem, ByVal site As SPWeb, ByVal fieldInfo As SPRelatedField)
        Dim targetList As SPList = fieldInfo.LookupList
        Dim relatedList As SPList = site.Lists(fieldInfo.ListId)

        Dim relatedField As SPFieldLookup = TryCast(relatedList.Fields(fieldInfo.FieldId), SPFieldLookup)
        Dim targetField As SPField = targetList.Fields.GetFieldByInternalName(relatedField.LookupField)

        Dim value As Object = match(targetField.Id)

        Dim q As New SPQuery()
        q.Query = String.Format( _
        "<Where><Eq><FieldRef Name=""{0}""/><Value Type=""{1}"">{2}</Value></Eq></Where>", _
        relatedField.InternalName, value.GetType(), value)

        Dim items As SPListItemCollection = relatedList.GetItems(q)

        If items.Count > 0 Then
            Console.WriteLine(vbLf & "{0} has {1} related items:", relatedList.Title, items.Count)
            For Each item As SPListItem In items
                Console.WriteLine(item.DisplayName)
            Next
        End If
    End Sub

End Module

Siehe auch

Aufgaben

Gewusst wie: Erstellen einer Nachschlagespalte mit mehreren Spalten

Referenz

SPFieldLookup

SPRelatedField

Weitere Ressourcen

Gewusst wie: Programmgesteuertes Festlegen des Löschungsverhaltens eines Nachschlagefelds