Gewusst wie: Erstellen einer Nachschlagespalte mit mehreren Spalten

Letzte Änderung: Mittwoch, 1. Dezember 2010

Gilt für: SharePoint Foundation 2010

In Microsoft SharePoint Foundation handelt es sich bei einer Nachschlagespalte um eine Spalte, die so konfiguriert ist, dass ein Wert aus einer Spalte in einer anderen Liste angezeigt wird. Wenn Benutzer ein neues Element erstellen, geben sie für die Nachschlagespalte keinen Wert ein, sondern wählen einen Wert aus einer Dropdownliste mit Werten in der Spalte der anderen Liste aus. In SharePoint Foundation 2010 ist es möglich, eine Nachschlagespalte mit mehren Spalten zu erstellen, wobei eine primäre Nachschlagespalte zum Auswählen eines Elements in der Zielliste verwendet wird und mindestens eine sekundäre Nachschlagespalte Werte aus anderen Spalten im selben Listenelement anzeigt.

Das Ziel einer Nachschlagespalte kann einer der folgenden Feldtypen sein: Counter, DateTime, Number, Text. Weitere Informationen zu diesen Feldtypen finden Sie in der SPFieldType-Aufzählung. Darüber hinaus kann der Feldtyp Calculated als Ziel verwendet werden, wenn die Ausgabe als Text erfolgt. Weitere Informationen finden Sie in der OutputType-Eigenschaft der SPFieldCalculated-Klasse. Der Feldtyp Computed kann als Ziel verwendet werden, wenn Nachschlageaktionen für das Feld aktiviert sind. Weitere Informationen finden Sie in der EnableLookup-Eigenschaft der SPFieldComputed-Klasse.

Das Verfahren zum Erstellen einer Nachschlagespalte mit mehreren Spalten hängt davon ab, ob Sie Spalten für eine neue Liste definieren oder zu einer vorhandenen Liste hinzufügen möchten. In beiden Fällen erstellen Sie die Spalten höchstwahrscheinlich im Kontext eines Features. Informationen zur Implementierung eines Features finden Sie unter Verwenden von Features.

Erstellen von Nachschlagespalten für eine neue Liste

Wenn Sie Nachschlagespalten für eine Liste erstellen, die Sie ebenfalls als Teil desselben Features erstellen, definieren Sie die Spalten und die Liste am einfachsten mit deklarativem XML-Code. Die SharePoint-Entwicklungstools in Microsoft Visual Studio 2010 enthalten mehrere Vorlagen, die einen Teil der Aufgaben automatisieren. Mithilfe der Vorlagen wird auch ein Lösungspaket für das Feature erstellt, das Sie automatisch durch Drücken von F5 bereitstellen. Wenn Sie das Debuggen beenden, wird die Lösung zurückgezogen. Dadurch wird der iterative Entwicklungsprozess äußerst einfach.

Sie können primäre und sekundäre Nachschlagespalten als Teil der Definition für eine neue Liste definieren (also als Teil des Listenschemas). Sehen die Best Practices jedoch die Erstellung von Websitespalten vor, müssen Sie sie als Websiteinhaltstyp einbinden und den Inhaltstyp als Basis für eine neue Liste verwenden. Diese Vorgehensweise fördert die Wiederverwendung, da Sie die Spalten auch in anderen Listen verwenden können. Außerdem können Sie damit die Spaltendefinitionen unabhängig von der Listendefinition pflegen und aktualisieren.

Vorbereitend müssen Sie einige Informationen über die Liste sammeln, die als Ziel der Nachschlagespalten fungieren soll. Zunächst müssen Sie wissen, wie die Zielliste identifiziert wird. Eine Nachschlagespalte wird wie jede andere Spalte auch durch ein Field-Element in einer XML-Datei definiert. Die Zielliste für eine Nachschlagespalte wird durch den Wert des List-Attributs des Field-Elements identifiziert. Der Attributwert kann entweder eine Listen-ID (eine GUID) oder eine webrelative URL sein. Die zweite Option, eine webrelative URL, funktioniert nur, wenn die Zielliste noch nicht vorhanden ist. In diesem Fall müssen Sie die Zielliste im selben Feature erstellen wie die Nachschlagespalte.

Wenn die Zielliste bereits vorhanden ist, können Sie ihre ID abrufen, indem Sie eine einfache Konsolenanwendung erstellen, die einen Verweis auf das SPList-Objekt abruft, von dem die Liste dargestellt wird, und die den Wert der ID-Eigenschaft an die Konsole ausgibt. Der gewünschte Wert wird von der ToString("B")-Methode der System.Guid-Klasse zurückgegeben.

using (SPSite site = new SPSite("https://localhost"))
{
    using (SPWeb web = site.RootWeb)
    {
        SPList list = web.Lists.TryGetList("Contoso Cutomers");
        if (list != null)
            Console.WriteLine(list.ID.ToString("B"));
    }
}

Sie können die ID auch mithilfe von Microsoft SharePoint Designer 2010 abrufen. Öffnen Sie die Website, wählen Sie im Navigationsbereich Listen und Bibliotheken aus, klicken Sie mit der rechten Maustaste auf den Namen der Liste, und wählen Sie Listeneinstellungen aus. Suchen Sie unter Listeninformationen den Eintrag Listen-ID. Kopieren Sie die vollständige GUID einschließlich der geschweiften Klammern.

Außerdem benötigen Sie den internen Namen jedes Felds in der Zielliste, auf das eines Ihrer Nachschlagefelder zeigt. Der interne Name ist der Wert des Name-Attributs für das Field-Element in der Felddefinition oder der Wert, der von der InternalName-Eigenschaft des SPField-Objekts zurückgegeben wird, wenn Sie die nötigen Informationen durch Erstellen von Code sammeln.

TippTipp

Die internen Namen für integrierte Spalten finden Sie in der Dokumentation für die SPBuiltInFieldId-Klasse. Der Name jedes Felds in der Klasse ist der interne Name einer integrierten Spalte. Beispielsweise lautet der interne Name des Felds Erstellt vonCreated_x0020_By.

Das Verfahren zum Erstellen einer Nachschlagespalte mit mehreren Spalten für eine neue Liste umfasst im Allgemeinen die folgenden Aufgaben:

  1. Definieren der Nachschlagespalten als Websitespalten

  2. Definieren eines Inhaltstyps, der die Nachschlagespalten verwendet

  3. Definieren einer Liste und einer Listeninstanz basierend auf dem neuen Inhaltstyp

  4. Bereitstellen, Aktivieren und Testen des Features

So definieren Sie Nachschlagespalten als Websitespalten

  1. Erstellen Sie in Visual Studio 2010 ein neues Projekt. Verwenden Sie dazu die Vorlage Leeres SharePoint-Projekt für SharePoint 2010.

  2. Wählen Sie im Assistenten zum Anpassen von SharePoint Als Sandkastenlösung bereitstellen aus, und klicken Sie dann auf Fertig stellen.

  3. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Ordner Features, und wählen Sie Funktion hinzufügen aus.

    Der Feature-Designer wird angezeigt. Sie können den Titel und die Beschreibung bearbeiten und einen Bereich für das Feature auswählen. Für diese Anwendung ist entweder Web oder Site als Bereich angemessen. Weitere Informationen finden Sie unter Elementbereich.

  4. (Optional) Erstellen Sie eine Zielliste für die Nachschlageaktionen.

    Zum Erstellen der Zielliste anhand einer benutzerdefinierten Listendefinition befolgen Sie die in Gewusst wie: Erstellen einer benutzerdefinierten Listendefinition beschriebenen Verfahren. Zum Erstellen der Zielliste anhand einer bestehenden Listendefinition führen Sie die folgenden Schritte aus:

    1. Wählen Sie im Projektmappen-Explorer das Projekt aus, und klicken Sie dann im Menü Projekt auf Neues Element hinzufügen.

    2. Wählen Sie im Dialogfeld Neues Element hinzufügen die Vorlage Listeninstanz aus, und geben Sie einen Namen für die Liste ein. Klicken Sie auf Hinzufügen.

    3. Folgen Sie den Anweisungen im Anpassungs-Assistenten für SharePoint.

      Sie werden vom Assistenten aufgefordert, eine Listenvorlage auszuwählen und eine URL für die Liste anzugeben.

  5. Erstellen Sie die Felddefinition für die primäre Nachschlagespalte.

    1. Klicken Sie im Projektmappen-Explorer auf das Projekt, und klicken Sie dann im Menü Projekt auf Neues Element hinzufügen.

    2. Wählen Sie im Dialogfeld Neues Element hinzufügen die Vorlage Leeres Element aus, geben Sie einen Namen für das Element (z. B. "SiteColumns") ein, und klicken Sie auf Hinzufügen.

      In Visual Studio wird dem Projekt ein Ordner mit dem von Ihnen eingegebenen Namen hinzugefügt. In diesem Ordner wird von Visual Studio eine Datei mit dem Namen Elements.xml erstellt.

    3. Fügen Sie in Elements.xml den folgenden XML-Code in das Elements-Element ein:

      <!-- Primary lookup column -->
      <Field Type="Lookup" Name="" ID="" List="" ShowField="" DisplayName="" Required="" Group="" />
      
    4. Geben Sie einen Wert für das Name-Attribut ein.

      Dies ist der interne Name des Felds. Der Name muss innerhalb der Sammlung eindeutig sein, die von der AvailableFields-Eigenschaft der Website zurückgegeben wird, in der dieses Feld erstellt wird. In SharePoint Foundation wird der Wert bei Bedarf korrigiert, um sicherzustellen, dass er eindeutig ist.

    5. Wählen Sie in Visual Studio im Menü Extras die Option GUID erstellen aus. Wählen Sie im Dialogfeld GUID erstellen die Option Registrierungsformat aus, klicken Sie auf Kopieren, und klicken Sie dann auf Beenden.

      Eine neue GUID wird in die Zwischenablage kopiert.

    6. Geben Sie einen Wert für das ID-Attribut an, indem Sie die neue GUID (einschließlich der geschweiften Klammern) zwischen den Anführungszeichen eingeben.

    7. Geben Sie einen Wert für das List-Attribut an.

      Das List-Attribut gibt die Zielliste der Nachschlagespalte an. Wenn diese Liste bereits vorhanden ist, ist dieser Wert die Listen-ID, eine GUID (einschließlich der geschweiften Klammern).

      Wenn die Zielliste nicht vorhanden ist, können Sie eine webrelative URL (z. B. Lists/Contoso Customers) als Wert für das List-Attribut verwenden. Allerdings müssen Sie die Liste als Teil desselben Features erstellen, mit dem die Nachschlagespalte erstellt wird. (Siehe Schritt 4.) Verwenden Sie den Wert des Url-Attributs für das ListInstance-Element, mit dem die Zielliste erstellt wird.

    8. Geben Sie einen Wert für das ShowField-Attribut an.

      Der Wert des ShowField-Attributs ist der interne Name des Zielfelds in der Liste, die vom List-Attribut angegeben wird.

    9. Geben Sie einen Wert für das DisplayName-Attribut an.

      Dieser Name wird in Listenansichten und auf Formularen für die Spalte angezeigt. Die Länge kann maximal 255 Zeichen betragen. Der Wert kann als Verweis auf eine lokalisierte Ressource im Format $Resources:String dienen. Weitere Informationen finden Sie unter Lokalisieren von SharePoint-Lösungen.

    10. Legen Sie das Required-Attribut entweder auf true oder auf false fest.

      Geben Sie true an, wenn Benutzer, die das New oder Edit-Formular für ein Listenelement ausfüllen, einen Wert für das Feld auswählen müssen. Geben Sie false an, wenn das Feld leer sein darf.

    11. (Optional) Geben Sie einen Wert für das Group-Attribut an.

      Das Group-Attribut gibt den Namen einer Gruppe an, in der die Spalte abgelegt werden soll, wenn sie im Site Columns-Katalog aufgeführt wird. Ist noch keine Gruppe mit diesem Namen vorhanden, wird sie erstellt. Die Definition einer Gruppe für von Ihnen erstellte Spalten kann die Verwaltung erleichtern.

  6. Erstellen Sie die Felddefinition für eine sekundäre Nachschlagespalte.

    1. Fügen Sie in Elements.xml den folgenden XML-Code in das Elements-Element ein:

      <!-- Secondary lookup column -->
      <Field Type="Lookup" FieldRef="" Name="" ID="" List="" ShowField="" DisplayName="" Required="" Group="" ReadOnly="TRUE" />
      
    2. Geben Sie einen Wert für das FieldRef-Attribut an.

      Dieses Attribut verweist auf die Felddefinition für die primäre Nachschlagespalte. Verwenden Sie den Wert des ID-Attributs für die primäre Nachschlagespalte, allerdings ohne die geschweiften Klammern.

    3. Geben Sie Werte für die übrigen Attribute wie in Schritt 5 an.

  7. Erstellen Sie Felddefinitionen für jeden der übrigen sekundären Nachschlagespalten in Ihrem Feature, indem Sie Schritt 6 so häufig wiederholen wie nötig.

Ihre Felddefinitionen sollten nun annähernd wie in folgendem Beispiel aussehen, in dem eine Nachschlagespalte mit mehreren Spalten für die Liste Contoso Customers definiert wird.

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="https://schemas.microsoft.com/sharepoint/">
  <!-- Primary lookup column: CustIDLookup -->
  <Field Type="Lookup" 
         Name="CustIDLookup" 
         ID="{2A670022-84AF-4C51-84F7-8E1B6025F104}" 
         List="Lists/Contoso Customers" 
         ShowField="ID" 
         DisplayName="Customer ID" 
         Required="true" 
         Group="Contoso Columns"/>
  <!-- Secondary lookup column: CustFirstNameLookup -->
  <Field Type="Lookup" 
         FieldRef="2A670022-84AF-4C51-84F7-8E1B6025F104" 
         Name="CustFirstNameLookup" 
         ID="{F0AF2CA5-EA71-46F7-9536-036539BA8C5C}" 
         List="Lists/Contoso Customers" 
         ShowField="FirstName" 
         DisplayName="First Name" 
         Required="false" 
         Group="Contoso Columns" 
         ReadOnly="TRUE" />
  <!-- Secondary lookup column: CustLastNameLookup -->
  <Field Type="Lookup" 
         FieldRef="2A670022-84AF-4C51-84F7-8E1B6025F104" 
         Name="CustLastNameLookup" 
         ID="{1D7973CE-49CD-46BD-9355-81014246578D}" 
         List="Lists/Contoso Customers" 
         ShowField="Title" 
         DisplayName="Last Name" 
         Required="false" 
         Group="Contoso Columns" 
         ReadOnly="TRUE" />
  <!-- Secondary lookup column: CustPhoneLookup -->
  <Field Type="Lookup" 
         FieldRef="2A670022-84AF-4C51-84F7-8E1B6025F104" 
         Name="CustPhoneLookup" 
         ID="{0F51E81B-2001-4A52-B33A-0F401814118B}" 
         List="Lists/Contoso Customers" 
         ShowField="HomePhone" 
         DisplayName="Phone" 
         Required="false" 
         Group="Contoso Columns" 
         ReadOnly="TRUE" />
</Elements>

So definieren Sie einen Websiteinhaltstyp

  1. Klicken Sie im Projektmappen-Explorer auf das Projekt, und klicken Sie dann im Menü Projekt auf Neues Element hinzufügen.

  2. Wählen Sie im Dialogfeld Neues Element hinzufügen die Vorlage Inhaltstyp aus, geben Sie einen Namen für den Inhaltstyp (z. B. "CustomerOrder") ein, und klicken Sie dann auf Hinzufügen.

    Das Dialogfeld Inhaltstypeinstellungen auswählen wird angezeigt.

  3. Wählen Sie einen Basisinhaltstyp aus, um von diesem zu erben. Klicken Sie auf Fertig stellen.

    In Visual Studio wird dem Projekt ein Ordner mit dem von Ihnen eingegebenen Namen hinzugefügt. In diesem Ordner befindet sich eine Datei mit dem Namen Elements.xml. Hier definieren Sie den Inhaltstyp.

  4. Öffnen Sie die Datei Elements.xml im Editor.

    HinweisHinweis

    Sie haben die richtige Datei geöffnet, wenn sie ein Elements-Element mit einem ContentType-Element enthält, in dem sich ein FieldRef-Element befindet.

  5. (Optional) In Visual Studio wird das Inherits-Attribut für das ContentType-Element auf TRUE festgelegt. Wenn Sie die Merkmale von geerbten Feldern außer Kraft setzen möchten (indem Sie beispielsweise den Anzeigenamen ändern), legen Sie den Wert des Inherits-Attributs auf FALSE fest.

  6. Verweisen Sie auf die primäre Nachschlagespalte, indem Sie den folgenden XML-Code in das FieldRefs-Element einfügen:

    <FieldRef ID="" Name="" DisplayName="" Required=""/>
    
  7. Legen Sie die Attribute ID und Name auf dieselben Werte fest wie das Field-Element der Attribute, das die primäre Nachschlagespalte definiert.

    Beim ID-Attribut wird zwischen Groß- und Kleinschreibung unterschieden. Sie müssen daher den Wert genauso kopieren, wie er im Field-Element erscheint. Vergessen Sie dabei die geschweiften Klammern nicht.

  8. Geben Sie Werte für die Attribute DisplayName und Required an.

  9. Wiederholen Sie die Schritte 6 bis 8 für jede sekundäre Nachschlagespalte.

  10. Wiederholen Sie die Schritte 6 bis 8 für alle vererbten Spalten, deren Merkmale Sie ändern möchten.

    Weitere Informationen finden Sie unter Gewusst wie: Verweisen auf eine Spalte in einem Inhaltstyp.

Die fertige Inhaltstypdefinition sollte ähnlich aussehen wie in folgendem Beispiel.

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="https://schemas.microsoft.com/sharepoint/">
  <!-- Parent ContentType: Item (0x01) -->
  <ContentType ID="0x0100b4160be88d9a4d669f690459bdcf43ff"
               Name="Contoso - Order"
               Group="Contoso Content Types"
               Description="Represents a customer order"
               Inherits="FALSE"
               Version="0">
    <FieldRefs>
      <FieldRef ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}" Name="Title" DisplayName="Description" Required="TRUE"/>
      <FieldRef ID="{bc91a437-52e7-49e1-8c4e-4698904b2b6d}" Name="LinkTitleNoMenu" DisplayName="Description" ReadOnly="TRUE" />
      <FieldRef ID="{82642ec8-ef9b-478f-acf9-31f7d45fbc31}" Name="LinkTitle" DisplayName="Description" ReadOnly="TRUE"/>
      <FieldRef ID="{2A670022-84AF-4C51-84F7-8E1B6025F104}" Name="CustIDLookup" DisplayName="Customer ID" Required="TRUE"/>
      <FieldRef ID="{F0AF2CA5-EA71-46F7-9536-036539BA8C5C}" Name="CustFirstNameLookup" DisplayName="First Name" Required="FALSE"/>
      <FieldRef ID="{1D7973CE-49CD-46BD-9355-81014246578D}" Name="CustLastNameLookup" DisplayName="Last Name" Required="FALSE"/>
      <FieldRef ID="{0F51E81B-2001-4A52-B33A-0F401814118B}" Name="CustPhoneLookup" DisplayName="Phone" Required="FALSE"/>
    </FieldRefs>
  </ContentType>
</Elements>

So definieren Sie eine Liste und eine Listeninstanz

  1. Klicken Sie im Projektmappen-Explorer auf das Projekt, und klicken Sie dann im Menü Projekt auf Neues Element hinzufügen.

  2. Wählen Sie im Dialogfeld Neues Element hinzufügen die Vorlage Listendefinition von Inhaltstyp aus, geben Sie einen Namen für die Liste (z. B. "OrdersListDefinition") ein, und klicken Sie dann auf Hinzufügen.

    Das Dialogfeld Listendefinitionseinstellungen auswählen wird angezeigt.

  3. Wählen Sie den Inhaltstyp aus, der die Nachschlagespalten enthält, aktivieren Sie das Kontrollkästchen Fügt eine Listeninstanz für diese Listendefinition hinzu, und klicken Sie dann auf Fertig stellen.

    In Visual Studio wird dem Projekt ein Ordner mit dem von Ihnen eingegebenen Namen hinzugefügt. Innerhalb des Ordners befindet sich die Datei Elements.xml, die ein ListTemplate-Element enthält, die Datei Schema.xml mit einem List-Element und der Ordner ListInstance1, in dem sich eine weitere Datei namens Elements.xml mit einem ListInstance-Element befindet.

  4. Öffnen Sie die Datei Schema.xml.

    Beachten Sie, dass das ContentTypes-Element eine Kopie der Inhaltstypdefinition und das Fields-Element Kopien der Felddefinitionen für die Nachschlagespalten enthält.

    Blättern Sie nach unten zum Views-Element. Es sind zwei Ansichten definiert, aber keine davon enthält FieldRef-Elemente, die auf Ihre Nachschlagespalten verweisen.

  5. Kopieren Sie die FieldRef-Elemente für Spalten, die in einer Listenansicht gerendert werden sollen, und fügen Sie sie innerhalb des ViewFields-Elements der Ansichtsdefinition ein.

    Nur die Attribute ID und Name sind für FieldRef-Elemente innerhalb eines ViewFields-Elements erforderlich.

Das Views-Element in der Datei Schema.xml sollte in etwa wie im folgenden Beispiel aussehen.

<Views>
  <View BaseViewID="0" Type="HTML" MobileView="TRUE" TabularView="FALSE">
    <Toolbar Type="Standard" />
    <XslLink Default="TRUE">main.xsl</XslLink>
    <RowLimit Paged="TRUE">30</RowLimit>
    <ViewFields>
      <FieldRef Name="LinkTitleNoMenu"></FieldRef>
      <FieldRef ID="{2A670022-84AF-4C51-84F7-8E1B6025F104}" Name="CustIDLookup" />
      <FieldRef ID="{F0AF2CA5-EA71-46F7-9536-036539BA8C5C}" Name="CustFirstNameLookup" />
      <FieldRef ID="{1D7973CE-49CD-46BD-9355-81014246578D}" Name="CustLastNameLookup"  />
      <FieldRef ID="{0F51E81B-2001-4A52-B33A-0F401814118B}" Name="CustPhoneLookup" />
    </ViewFields>
    <Query>
      <OrderBy>
        <FieldRef Name="Modified" Ascending="FALSE">
        </FieldRef>
      </OrderBy>
    </Query>
    <ParameterBindings>
      <ParameterBinding Name="AddNewAnnouncement" Location="Resource(wss,addnewitem)" />
      <ParameterBinding Name="NoAnnouncements" Location="Resource(wss,noXinviewofY_LIST)" />
      <ParameterBinding Name="NoAnnouncementsHowTo" Location="Resource(wss,noXinviewofY_ONET_HOME)" />
    </ParameterBindings>
  </View>
  <View BaseViewID="1" Type="HTML" WebPartZoneID="Main" DisplayName="$Resources:core,objectiv_schema_mwsidcamlidC24;" DefaultView="TRUE" MobileView="TRUE" MobileDefaultView="TRUE" SetupPath="pages\viewpage.aspx" ImageUrl="/_layouts/images/generic.png" Url="AllItems.aspx">
    <Toolbar Type="Standard" />
    <XslLink Default="TRUE">main.xsl</XslLink>
    <RowLimit Paged="TRUE">30</RowLimit>
    <ViewFields>
      <FieldRef Name="Attachments">
      </FieldRef>
      <FieldRef Name="LinkTitle">
      </FieldRef>
      <FieldRef ID="{2A670022-84AF-4C51-84F7-8E1B6025F104}" Name="CustIDLookup" />
      <FieldRef ID="{F0AF2CA5-EA71-46F7-9536-036539BA8C5C}" Name="CustFirstNameLookup" />
      <FieldRef ID="{1D7973CE-49CD-46BD-9355-81014246578D}" Name="CustLastNameLookup"  />
      <FieldRef ID="{0F51E81B-2001-4A52-B33A-0F401814118B}" Name="CustPhoneLookup" />
    </ViewFields>
    <Query>
      <OrderBy>
        <FieldRef Name="ID">
        </FieldRef>
      </OrderBy>
    </Query>
    <ParameterBindings>
      <ParameterBinding Name="NoAnnouncements" Location="Resource(wss,noXinviewofY_LIST)" />
      <ParameterBinding Name="NoAnnouncementsHowTo" Location="Resource(wss,noXinviewofY_DEFAULT)" />
    </ParameterBindings>
  </View>
</Views>

So stellen Sie Features bereit, aktivieren und testen diese

  1. Drücken Sie F5, um die Lösung bereitzustellen und das Feature zu aktivieren.

  2. Klicken Sie im Menü Websiteaktionen auf Websiteeinstellungen.

  3. Klicken Sie unter Galerien auf Websitespalten. Prüfen Sie, ob die primäre Nachschlagespalte in den Websitespalten vorhanden ist.

  4. Klicken Sie auf den Namen der primären Nachschlagespalte. Überprüfen Sie auf der Seite Websitespalte ändern unter Spalte zum Anzeigen dieser zusätzlichen Felder hinzufügen, ob die Namen der sekundären Nachschlagespalten ausgewählt sind.

  5. Kehren Sie zur Seite Websiteeinstellungen zurück. Klicken Sie unter Galerien auf Websiteinhaltstypen.

  6. Klicken Sie auf den Namen des Inhaltstyps. Überprüfen Sie auf der Seite Informationen zum Websiteinhaltstyp unter Spalten, ob die primäre Nachschlagespalte aufgeführt ist.

  7. Klicken Sie im Navigationsbereich links auf den Namen der Liste.

  8. Klicken Sie auf dem Menüband auf Liste und dann auf Listeneinstellungen.

  9. Überprüfen Sie auf der Seite Listeneinstellungen unter Spalten, ob die primäre und die sekundären Nachschlagespalten aufgeführt sind.

  10. Kehren Sie zur Listenansicht zurück. Versuchen Sie, der Liste ein neues Element hinzuzufügen. (Möglicherweise müssen Sie zunächst Elemente zur Zielliste hinzufügen.)

  11. Nachdem Sie den Vorgang abgeschlossen haben, schließen Sie den Browser, um das Debuggen zu beenden.

    Das Feature wird von Visual Studio deaktiviert, und die Lösung wird zurückgezogen.

Weitere Schritte

Ein vollständiges Feature sollte die von ihm erstellten Objekte beim Deaktivieren entfernen. Dies wird in Visual Studio nach Möglichkeit automatisch erledigt, um den iterativen Entwicklungsprozess reibungsloser zu machen. In einer Produktionsumgebung sollte das Feature sein Umfeld aber selbstständig bereinigen. Hierfür müssen Sie entsprechenden Code schreiben.

Bereinigungscode muss in der FeatureDeactivating-Methode einer Unterklasse der SPFeatureReceiver-Klasse platziert werden. Die Vorgehensweise hängt in gewissem Maß von den internen Richtlinien ab. Beispielsweise sollten Sie Listen wahrscheinlich nicht löschen, wenn diese wertvolle Daten enthalten. In diesem Fall müssen Sie eine Möglichkeit bereitstellen, die Daten so zu speichern, dass sie von den Benutzern wiederhergestellt werden können. Abgesehen von derartigen Überlegungen sollten Sie beim Schreiben von Code für die FeatureDeactivating-Methode die folgenden Richtlinien berücksichtigen:

  • Löschen Sie Listeninhaltstypen vor dem Websiteinhaltstyp, von dem sie abgeleitet wurden.

    Rufen Sie die statische SPContentTypeUsage.GetUsages-Methode auf, um Informationen zu den Verwendungsorten eines Inhaltstyps zu erhalten. Ein Beispiel finden Sie in der Delete-Methode in der SPContentTypeCollection-Klasse.

  • Löschen Sie Websiteinhaltstypen vor den Websitespalten, auf die sie verweisen.

  • Löschen Sie erst alle sekundären Nachschlagespalten, bevor Sie die primäre Nachschlagespalte löschen, von der sie alle abhängig sind.

    Ein Beispiel finden Sie in der Implementierung der FeatureDeactivating-Methode am Ende des folgenden Abschnitts "Hinzufügen von Nachschlagespalten zu einer vorhandenen Liste".

  • Melden Sie Ausnahmen und Fehler, damit ein Administrator ggf. Problembehandlungsmaßnahmen einleiten kann.

Hinzufügen von Nachschlagespalten zu einer vorhandenen Liste

Sie können Nachschlagespalten auch einer bereits vorhandenen Liste hinzufügen, indem Sie Servercode verfassen, der das SharePoint Foundation-Objektmodell verwendet. Am besten erstellen Sie dazu ein Feature und schreiben den Code in einen Ereignisempfänger für das Feature. Die Nachschlagespalten werden dann beim Aktivieren des Features durch den Code erstellt.

HinweisHinweis

Das folgende Verfahren setzt voraus, dass die Zielliste der Nachschlagespalten sich auf derselben Website befindet wie die Liste mit den Nachschlagespalten. Websiteübergreifende Nachschlageaktionen sind aber möglich. Weitere Informationen finden Sie in der LookupWebId-Eigenschaft.

So fügen Sie einer vorhandenen Liste eine Nachschlagespalte mit mehreren Spalten hinzu

  1. Erstellen Sie in Visual Studio 2010 ein neues Projekt. Verwenden Sie dazu die Vorlage Leeres SharePoint-Projekt für SharePoint 2010.

  2. Wählen Sie im Assistenten zum Anpassen von SharePoint die Option Als Sandkastenlösung bereitstellen aus. Klicken Sie auf Fertig stellen.

  3. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Ordner Features, und wählen Sie Funktion hinzufügen aus.

    Der Feature-Designer wird geöffnet. Sie können den Titel und die Beschreibung bearbeiten und einen Bereich für das Feature auswählen. Für diese Anwendung ist entweder Web oder Site als Bereich angemessen. Weitere Informationen finden Sie unter Elementbereich.

  4. Klicken Sie mit der rechten Maustaste auf den Featurenamen (standardmäßig Feature1), und wählen Sie dann Ereignisempfänger hinzufügen aus.

    In Visual Studio wird eine Unterklasse der SPFeatureReceiver-Klasse erzeugt.

  5. Entfernen Sie den Kommentar für die FeatureActivated-Methode.

  6. Schreiben Sie in der FeatureActivated-Methode Code, um entweder die aktuelle Website (bei Featurebereich Web) oder die Stammwebsite der Websitesammlung (bei Bereich Site) abzurufen.

    Greifen Sie hierzu auf die Feature-Eigenschaft des SPFeatureReceiverProperties-Objekts zu, das als properties-Parameter an die Methode übergeben wird. Die Feature-Eigenschaft gibt ein SPFeature-Objekt zurück. Die Parent-Eigenschaft dieses Objekts gibt ein SPWeb-Objekt zurück, das als Object-Typ geschachtelt wird, wenn der Featurebereich Web ist, oder als SPSite-Objekt, wenn der Bereich Site ist.

    Das folgende Codebeispiel veranschaulicht diese Vorgehensweise.

    SPWeb web = properties.Feature.Parent as SPWeb;
    if (web == null)
    {
        SPSite site = properties.Feature.Parent as SPSite;
        if (site != null)
            web = site.RootWeb;
    }
    
    Dim web As SPWeb = TryCast(properties.Feature.Parent, SPWeb)
    If web Is Nothing Then
        Dim site As SPSite = TryCast(properties.Feature.Parent, SPSite)
        If site IsNot Nothing Then
            web = site.RootWeb
        End If
    End
    
  7. Instanziieren Sie zwei SPList-Objekte: eines für die Liste, die die Nachschlagespalten enthalten soll, und eines für die Liste, die als Ziel für die Nachschlagespalten fungiert.

    Beispielsweise werden mit dem folgenden Codebeispiel Objekte für die Listen Contoso Orders und Contoso Customers erstellt.

    SPList customers = web.Lists.TryGetList("Contoso Customers");
    SPList orders = web.Lists.TryGetList("Contoso Orders");
    
    Dim customers As SPList = web.Lists.TryGetList("Contoso Customers")
    Dim orders As SPList = web.Lists.TryGetList("Contoso Orders")
    
  8. Instanziieren Sie SPField-Objekte, die die Spalten darstellen, welche als Ziele für die Nachschlagespalten dienen sollen.

    Der folgende Code beispielsweise instanziiert Objekte, die vier Spalten in der Liste Contoso Customers repräsentieren, welche als Ziele der Nachschlagespalten in der Liste Contoso Orders dienen sollten.

    SPField custID, custLName, custFName, custPhone;
    try
    {
        custID = customers.Fields.GetField("ID");
        custFName = customers.Fields.GetField("First Name");
        custLName = customers.Fields.GetField("Last Name");
        custPhone = customers.Fields.GetField("Contact Phone");
    }
    catch (ArgumentException ex)
    {
    
        // One of the fields was not found on the Customers list.
        System.Diagnostics.Trace.WriteLine(logEntry + ex.Message);
        return;
    }
    
    Dim custID, custLName, custFName, custPhone As SPField
    Try
        custID = customers.Fields.GetField("ID")
        custFName = customers.Fields.GetField("First Name")
        custLName = customers.Fields.GetField("Last Name")
        custPhone = customers.Fields.GetField("Contact Phone")
    Catch ex As ArgumentException
    
        ' One of the fields was not found on the Customers list.
        System.Diagnostics.Trace.WriteLine(logEntry + ex.Message)
        Return
    End Try
    
  9. Erstellen Sie die primäre Nachschlagespalte, indem Sie die AddLookup-Methode des SPFieldCollection-Objekts aufrufen, das von der Fields-Eigenschaft der Liste für die Nachschlagespalten zurückgegeben wird.

    Die AddLookup-Methode hat drei Parameter:

    • displayName: Eine Zeichenfolge, die den Anzeigenamen für die Nachschlagespalte enthält.

    • lookupListId: Eine GUID, die zugleich die ID der Zielliste ist.

    • bRequired: Ein Boolean-Wert, der angibt, ob Benutzer in New- und Edit-Formularen einen Wert für die Nachschlagespalte auswählen müssen.

    Die Methode gibt eine Zeichenfolge mit dem internen Namen der Nachschlagespalte zurück. Sie können ein Objekt für die neue Spalte abrufen, indem Sie den internen Namen an die GetFieldByInternalName-Methode übergeben.

    Beispielsweise erstellen Sie mit folgendem Code eine Nachschlagespalte für die Liste Contoso Orders, deren Anzeigename die Kunden-ID (Customer ID) und Zielliste Constoso Customers ist.

    string strPrimary = orders.Fields.AddLookup("Customer ID", customers.ID, true);
    
    Dim strPrimary As String = orders.Fields.AddLookup("Customer ID", customers.ID, True)
    
  10. Legen Sie die LookupField-Eigenschaft der primären Nachschlagespalte so fest, dass sie auf eine Spalte in der Zielliste zeigt.

    Sie können ein SPField-Objekt abrufen, das die neue primäre Nachschlagespalte repräsentiert, indem Sie den von der AddLookup-Methode zurückgegebenen internen Namen als Argument an GetFieldByInternalName(String) übergeben. Wandeln Sie das SPField-Objekt dann in den SPFieldLookup-Typ um, bevor Sie auf die LookupField-Eigenschaft zugreifen. Diese Eigenschaft akzeptiert eine Zeichenfolge mit dem internen Namen des Zielfelds.

    Mit folgendem Code wird die LookupField-Eigenschaft der im Beispiel für den vorherigen Schritt erstellten Spalte festgelegt.

    SPFieldLookup primary = orders.Fields.GetFieldByInternalName(strPrimary) as SPFieldLookup;
    primary.LookupField = custID.InternalName;
    primary.Update();
    
    Dim primary As SPFieldLookup = TryCast(orders.Fields.GetFieldByInternalName(strPrimary), SPFieldLookup)
    primary.LookupField = custID.InternalName
    primary.Update()
    
  11. Erstellen Sie die sekundären Nachschlagespalten, indem Sie die AddDependentLookup-Methode der Feldsammlung aufrufen, die zu der Liste mit den Nachschlagespalten gehört.

    Die AddDependentLookup-Methode hat zwei Parameter:

    • displayName: Eine Zeichenfolge, die den Anzeigenamen für die Nachschlagespalte enthält.

    • primaryLookupFieldId: Eine GUID, die zugleich die ID der primären Nachschlagespalte ist.

    Wie die AddLookup-Methode gibt auch die AddDependentLookup-Methode eine Zeichenfolge mit dem internen Namen der neuen Spalte zurück.

    Mit der folgenden Codezeile wird die Last Name-Spalte erstellt, die von der im vorherigen Beispiel erstellten primären Nachschlagespalte abhängig ist.

    string strLName = orders.Fields.AddDependentLookup("Last Name", primary.Id);
    
    Dim strLName As String = orders.Fields.AddDependentLookup("Last Name", primary.Id)
    
  12. Legen Sie die LookupField-Eigenschaft der neuen sekundären Nachschlagespalte nach demselben Verfahren wie in Schritt 10 fest.

  13. Wiederholen Sie die Schritte 10 und 11 für jede sekundäre Nachschlagespalte, die Sie hinzufügen möchten.

  14. (Optional) Fügen Sie Listenansichten eine oder mehrere Nachschlagespalten hinzu, indem Sie die Add-Methode des SPViewFieldCollection-Objekts aufrufen, das von der ViewFields-Eigenschaft der einzelnen Ansichten zurückgegeben wird.

Beispiel

Im folgenden Beispiel sehen Sie den vollständigen Code einer Unterklasse der SPFeatureReceiver-Klasse, die Nachschlagespalten für die Liste Contoso Orders erstellt und löscht. Code in der FeatureActivated-Methode erstellt eine primäre Nachschlagespalte namens Customer ID, die den Wert der ID-Spalte der Liste Contoso Customers nachschlägt. Anschließend werden vom Code sekundäre Nachschlagespalten für First Name, Last Name und Phone erstellt und der Standardansicht der Liste Contoso Orders hinzugefügt.

Das Beispiel enthält außerdem Code für die FeatureDeactivating-Methode, mit dem alle in der FeatureActivated-Methode erstellten Nachschlagespalten gelöscht werden. Beachten Sie, dass Sie erst alle sekundären Nachschlagespalten löschen müssen, bevor Sie die primäre Nachschlagespalte löschen, von der sie alle abhängig sind.

using System;
using System.Runtime.InteropServices;
using Microsoft.SharePoint;

namespace Contoso.Orders.Features.CustomerLookups
{
    [Guid("49e72c4b-cfcb-4665-9c2a-fdadf0a3b018")]
    public class CustomerLookupsEventReceiver : SPFeatureReceiver
    {

        // Define static field names.
        const string STATIC_CUST_ID = "CustID";
        const string STATIC_CUST_FNAME = "CustFName";
        const string STATIC_CUST_LNAME = "CustLName";
        const string STATIC_CUST_PHONE = "CustPhone";

        public override void FeatureActivated(SPFeatureReceiverProperties properties)
        {
            string logEntry = properties.Definition.DisplayName + " activation error: ";

            // Get an object representing either the current website (if the scope is Web)
            // or the root website (if the scope is Site).
            SPWeb web = properties.Feature.Parent as SPWeb;
            if (web == null)
            {
                SPSite site = properties.Feature.Parent as SPSite;
                if (site != null)
                    web = site.RootWeb;
            }
            if (web == null)
            {
                System.Diagnostics.Trace.WriteLine(logEntry + "Invalid scope");
                return;
            }

            // Get objects for the two lists.
            SPList customers = web.Lists.TryGetList("Contoso Customers");
            SPList orders = web.Lists.TryGetList("Contoso Orders");
            if (customers == null || orders == null)
            {
                System.Diagnostics.Trace.WriteLine(logEntry + "List not found");
                return;
            }

            // Get the fields from the Customers list that will be seen on the Orders list.
            SPField custID, custLName, custFName, custPhone;
            try
            {
                custID = customers.Fields.GetField("ID");
                custFName = customers.Fields.GetField("First Name");
                custLName = customers.Fields.GetField("Last Name");
                custPhone = customers.Fields.GetField("Contact Phone");
            }
            catch (ArgumentException ex)
            {
                // One of the fields was not found on the Customers list.
                System.Diagnostics.Trace.WriteLine(logEntry + ex.Message);
                return;
            }

            /* 
            * Create a multi-column lookup on the Orders list. 
            */

            // Create the primary column: Customer ID.
            string strPrimary = orders.Fields.AddLookup("Customer ID", customers.ID, true);

            SPFieldLookup primary = orders.Fields.GetFieldByInternalName(strPrimary) as SPFieldLookup;
            primary.LookupField = custID.InternalName;
            primary.StaticName = STATIC_CUST_ID;
            primary.Update();

            // Create a secondary column: First Name.
            string strFName = orders.Fields.AddDependentLookup("First Name", primary.Id);

            SPFieldLookup ordersFName = orders.Fields.GetFieldByInternalName(strFName) as SPFieldLookup;
            ordersFName.LookupField = custFName.InternalName;
            ordersFName.StaticName = STATIC_CUST_FNAME;
            ordersFName.Update();

            // Create a secondary column: Last Name.
            string strLName = orders.Fields.AddDependentLookup("Last Name", primary.Id);

            SPFieldLookup ordersLName = orders.Fields.GetFieldByInternalName(strLName) as SPFieldLookup;
            ordersLName.LookupField = custLName.InternalName;
            ordersLName.StaticName = STATIC_CUST_LNAME;
            ordersLName.Update();

            // Create a secondary column: Phone.
            string strPhone = orders.Fields.AddDependentLookup("Phone", primary.Id);

            SPFieldLookup ordersPhone = orders.Fields.GetFieldByInternalName(strPhone) as SPFieldLookup;
            ordersPhone.LookupField = custPhone.InternalName;
            ordersPhone.StaticName = STATIC_CUST_PHONE;
            ordersPhone.Update();

            // Add columns to the default view.
            AddToDefaultView(orders, strFName);
            AddToDefaultView(orders, strLName);
            AddToDefaultView(orders, strPhone);
        }

        public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
        {
            string logEntry = properties.Definition.DisplayName + " deactivation error: ";

            // Get an object representing either the current website (if the scope is Web)
            // or the root website (if the scope is Site).
            SPWeb web = properties.Feature.Parent as SPWeb;
            if (web == null)
            {
                SPSite site = properties.Feature.Parent as SPSite;
                if (site != null)
                    web = site.RootWeb;
            }
            if (web == null)
            {
                System.Diagnostics.Trace.WriteLine(logEntry + "Invalid scope");
                return;
            }

            // Get the Orders list.
            SPList orders = web.Lists.TryGetList("Contoso Orders");
            if (orders == null)
            {
                System.Diagnostics.Trace.WriteLine(logEntry + "List not found");
                return;
            }

            // Delete the lookup fields.
            // Note that you must delete dependent lookup fields
            // before deleting the primary lookup field.
            SPFieldLookup primaryLookup = orders.Fields.TryGetFieldByStaticName(STATIC_CUST_ID) as SPFieldLookup;
            if (primaryLookup != null && !primaryLookup.IsDependentLookup)
            {
                string[] dependentLookupNames = primaryLookup.GetDependentLookupInternalNames().ToArray();
                if (dependentLookupNames.Length != 0)
                {
                    foreach (string dependent in dependentLookupNames)
                    {
                        orders.Fields.Delete(dependent);
                    }
                }
                primaryLookup.Delete();
            }

        }

        public void AddToDefaultView(SPList list, string fieldName)
        {
            if (list != null && list.Fields.ContainsField(fieldName) && !list.DefaultView.ViewFields.Exists(fieldName))
            {
                SPView defaultView = list.DefaultView;
                defaultView.ViewFields.Add(fieldName);
                defaultView.Update();
            }
        }
    }
}
Option Explicit On
Option Strict On

Imports System
Imports System.Runtime.InteropServices
Imports Microsoft.SharePoint


<GuidAttribute("c17f29fb-670e-41ba-af43-8a1e97c1cae5")> _
Public Class CustomerLookupsEventReceiver 
    Inherits SPFeatureReceiver

    ' Define static field names.
    Const STATIC_CUST_ID As String = "CustID"
    Const STATIC_CUST_FNAME As String = "CustFName"
    Const STATIC_CUST_LNAME As String = "CustLName"
    Const STATIC_CUST_PHONE As String = "CustPhone"

 
    Public Overrides Sub FeatureActivated(ByVal properties As SPFeatureReceiverProperties)
        Dim logEntry As String = properties.Definition.DisplayName + " activation error: "

        ' Get an object representing either the current website (if the scope is Web)
        ' or the root website (if the scope is Site).
        Dim web As SPWeb = TryCast(properties.Feature.Parent, SPWeb)
        If web Is Nothing Then
            Dim site As SPSite = TryCast(properties.Feature.Parent, SPSite)
            If site IsNot Nothing Then
                web = site.RootWeb
            End If
        End If
        If web Is Nothing Then
            System.Diagnostics.Trace.WriteLine(logEntry + "Invalid scope")
            Return
        End If

        ' Get objects for the two lists.
        Dim customers As SPList = web.Lists.TryGetList("Contoso Customers")
        Dim orders As SPList = web.Lists.TryGetList("Contoso Orders")
        If customers Is Nothing OrElse orders Is Nothing Then
            System.Diagnostics.Trace.WriteLine(logEntry + "List not found")
            Return
        End If

        ' Get the fields from the Customers list that will be seen on the Orders list.
        Dim custID, custLName, custFName, custPhone As SPField
        Try
            custID = customers.Fields.GetField("ID")
            custFName = customers.Fields.GetField("First Name")
            custLName = customers.Fields.GetField("Last Name")
            custPhone = customers.Fields.GetField("Contact Phone")
        Catch ex As ArgumentException

            ' One of the fields was not found on the Customers list.
            System.Diagnostics.Trace.WriteLine(logEntry + ex.Message)
            Return
        End Try

        ' 
        '  Create a multi-column lookup on the Orders list. 
        '            

        ' Create the primary column: Customer ID.
        Dim strPrimary As String = orders.Fields.AddLookup("Customer ID", customers.ID, True)

        Dim primary As SPFieldLookup = TryCast(orders.Fields.GetFieldByInternalName(strPrimary), SPFieldLookup)
        primary.LookupField = custID.InternalName
        primary.StaticName = STATIC_CUST_ID
        primary.Update()

        ' Create a secondary column: First Name.
        Dim strFName As String = orders.Fields.AddDependentLookup("First Name", primary.Id)

        Dim ordersFName As SPFieldLookup = TryCast(orders.Fields.GetFieldByInternalName(strFName), SPFieldLookup)
        ordersFName.LookupField = custFName.InternalName
        ordersFName.StaticName = STATIC_CUST_FNAME
        ordersFName.Update()

        ' Create a secondary column: Last Name.
        Dim strLName As String = orders.Fields.AddDependentLookup("Last Name", primary.Id)

        Dim ordersLName As SPFieldLookup = TryCast(orders.Fields.GetFieldByInternalName(strLName), SPFieldLookup)
        ordersLName.LookupField = custLName.InternalName
        ordersLName.StaticName = STATIC_CUST_LNAME
        ordersLName.Update()

        ' Create a secondary column: Phone.
        Dim strPhone As String = orders.Fields.AddDependentLookup("Phone", primary.Id)

        Dim ordersPhone As SPFieldLookup = TryCast(orders.Fields.GetFieldByInternalName(strPhone), SPFieldLookup)
        ordersPhone.LookupField = custPhone.InternalName
        ordersPhone.StaticName = STATIC_CUST_PHONE
        ordersPhone.Update()

        ' Add columns to the default view.
        AddToDefaultView(orders, strFName)
        AddToDefaultView(orders, strLName)
        AddToDefaultView(orders, strPhone)
    End Sub

    Public Overrides Sub FeatureDeactivating(ByVal properties As SPFeatureReceiverProperties)

        Dim logEntry As String = properties.Definition.DisplayName + " deactivation error: "

        ' Get an object representing either the current website (if the scope is Web)
        ' or the root website (if the scope is Site).
        Dim web As SPWeb = TryCast(properties.Feature.Parent, SPWeb)
        If web Is Nothing Then
            Dim site As SPSite = TryCast(properties.Feature.Parent, SPSite)
            If site IsNot Nothing Then
                web = site.RootWeb
            End If
        End If
        If web Is Nothing Then
            System.Diagnostics.Trace.WriteLine(logEntry + "Invalid scope")
            Return
        End If

        ' Get the Orders list.
        Dim orders As SPList = web.Lists.TryGetList("Contoso Orders")
        If orders Is Nothing Then
            System.Diagnostics.Trace.WriteLine(logEntry + "List not found")
            Return
        End If

        ' Delete the lookup fields.
        ' Note that you must delete dependent lookup fields
        ' before deleting the primary lookup field.
        Dim primaryLookup As SPFieldLookup = TryCast(orders.Fields.TryGetFieldByStaticName(STATIC_CUST_ID), SPFieldLookup)
        If primaryLookup IsNot Nothing AndAlso Not primaryLookup.IsDependentLookup Then
            Dim dependentLookupNames As String() = primaryLookup.GetDependentLookupInternalNames().ToArray()
            If dependentLookupNames.Length > 0 Then
                For Each dependent As String In dependentLookupNames
                    orders.Fields.Delete(dependent)
                Next
            End If
            primaryLookup.Delete()
        End If

    End Sub

    Public Sub AddToDefaultView(ByVal list As SPList, ByVal fieldName As String)
        If list IsNot Nothing AndAlso list.Fields.ContainsField(fieldName) AndAlso Not list.DefaultView.ViewFields.Exists(fieldName) Then
            Dim defaultView As SPView = list.DefaultView
            defaultView.ViewFields.Add(fieldName)
            defaultView.Update()
        End If
    End Sub

End Class

Siehe auch

Referenz

Field-Element (Field)

SPFieldLookup

AddLookup(String, Guid, Boolean)

AddDependentLookup(String, Guid)

Konzepte

Nachschlagevorgänge und Listenbeziehungen