Freigeben über


Gewusst wie: Verweisen auf eine Spalte in einem Inhaltstyp

Letzte Änderung: Mittwoch, 10. November 2010

Gilt für: SharePoint Foundation 2010

Spalten werden nie direkt in einem Inhaltstyp definiert. Sie werden an anderer Stelle definiert und im Inhaltstyp referenziert, d. h. es wird darauf verwiesen. Sie verweisen aus zwei Gründen in einem Inhaltstyp auf eine Spalte:

  • Sie möchten dem Inhaltstyp eine Spalte hinzufügen.

  • Sie möchten Merkmale einer Spalte ändern, die der Inhaltstyp von seinem übergeordneten Inhaltstyp erbt.

    Weitere Informationen zur Vererbung finden Sie in der Beschreibung des Inherits-Attributs des ContentType-Elements im Definitionsschema für Inhaltstypen.

In deklarativem XML verweisen Sie auf eine Spalte mithilfe des FieldRef-Elements. In Code erstellen Sie hierfür ein SPFieldLink-Objekt.

HinweisHinweis

In Microsoft SharePoint Foundation sind Felder Spalten mit einem anderen Namen. Häufig wird das Wort "Spalte" verwendet, wenn von der Darstellung eines Felds auf der Benutzeroberfläche die Rede ist.

Weitere Informationen zu den Unterschieden zwischen Spalten und Verweisen auf Spalten finden Sie unter Felder und Feldverweise.

Verweisen auf Spalten mithilfe von deklarativem XML

Eine Möglichkeit zum Erstellen eines Inhaltstyps besteht darin, den Inhaltstyp mithilfe von deklarativem XML in der Elementmanifestdatei für ein Feature zu definieren. Beim Aktivieren des Features wird der Inhaltstyp erstellt. Weitere Informationen finden Sie unter Inhaltstypdefinitionen.

In die Definition eines Inhaltstyps kann eine Spalte eingeschlossen werden, indem darauf in einem FieldRef-Element verwiesen wird. Bei der referenzierten Spalte kann es sich um eine bereits als Websitespalte vorhandene Spalte oder um eine neue Spalte handeln, die von demselben Feature erstellt wurde, das den Inhaltstyp erstellt. Sie können mit dem FieldRef-Element auch auf eine Spalte verweisen, die der Inhaltstyp von seinem übergeordneten Inhaltstyp erbt. In diesem Fall würden Sie nicht auf die Spalte verweisen, um sie hinzuzufügen, sondern um einige ihrer Merkmale bei Verwendung in dem Inhaltstyp zu ändern.

So erstellen Sie einen Spaltenverweis mithilfe von deklarativem XML

  1. Fügen Sie in der Inhaltstypdefinition im FieldRefs-Knoten ein FieldRef-Element hinzu.

  2. Verweisen Sie auf die Spalte, indem Sie den Wert des ID-Attributs des FieldRef-Elements auf die ID der Spalte festlegen.

    Der Wert muss die Zeichenfolgendarstellung einer GUID in geschweiften Klammern sein, wie im folgenden Beispiel dargestellt:

    ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}"

    Beim ID-Attribut wird die Groß-/Kleinschreibung beachtet. Sie müssen das Attribut also genau auf den Wert des ID-Attributs des Field-Elements festlegen.

    Sie finden die IDs für integrierte Spalten in der Datei fieldswss.xml im folgenden Pfad: %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\FEATURES\fields.

  3. Legen Sie den Wert des Name-Attributs des FieldRef-Elements auf denselben Wert fest wie das Name-Attribut für das Field-Element, das die Spalte darstellt.

  4. Legen Sie andere Attribute des FieldRef-Elements fest, um die Spalte wie gewünscht zu definieren.

    Wenn Sie beispielsweise den Text ändern möchten, der für die Spalte angezeigt wird, legen Sie den Wert des DisplayName-Attributs fest.

Viele Attribute des FieldRef-Elements haben denselben Namen und Zweck wie Attribute des referenzierten Field-Elements. Nur der Wert des ID-Attributs und die Name-Attribute müssen identisch sein. Wenn Sie für andere Attribute einen anderen Wert im FieldRef-Element verwenden, können sich Merkmale der Spalte ändern, wenn sie im Inhaltstyp verwendet wird, ohne dass die referenzierte Spalte selbst geändert wird.

Wichtiger HinweisWichtig

Die Attribute ID, Name, DisplayName und Required des FieldRef-Elements sind immer erforderlich, auch wenn das FieldRef-Element auf ein Feld verweist, das in demselben Elementmanifest definiert ist.

Beispiel

Das folgende Beispiel zeigt das Elementmanifest für ein Feature, von dem drei Websitespalten und zwei Websiteinhaltstypen erstellt werden. Der erste Inhaltstyp, Financial Document, ist ein untergeordnetes Element des integrierten Inhaltstyps Document.

Die Definition für Financial Document verweist auf zwei der neuen Websitespalten, DateOpened und Amount. Im FieldRef-Element, das auf die DateOpened-Spalte verweist, wird das DisplayName-Attribut so festgelegt, dass der Spaltenname als Date statt wie in der Websitespalte definiert als DateOpened gerendert wird.

Die Definition für Purchase Order verweist auf die dritte neue Websitespalte, CostCenter, und legt das DisplayName-Attribut so fest, dass der Spaltenname als Department statt wie in der Websitespalte definiert als Cost Center gerendert wird.

Purchase Order erbt die Spaltenverweise von seinem übergeordneten Element, Financial Document, somit muss nicht nochmals auf die Spalten verwiesen werden. Der Inhaltstyp erbt auch einen Verweis auf die Title-Spalte von Financial Document, das die Spalte wiederum von seinem übergeordneten Element, Document, erbt. Der Purchase Order-Typ enthält ein FieldRef-Element für die Title-Spalte, durch das das geerbte DisplayName-Attribut mit einem eigenen Wert überschrieben wird.

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="https://schemas.microsoft.com/sharepoint/">

  <!-- New Site Columns -->

  <Field ID="{1511BF28-A787-4061-B2E1-71F64CC93FD5}"
         Name="DateOpened"
         DisplayName="Date Opened"
         Type="DateTime"
         Format="DateOnly"
         Required="FALSE"
         Group="Financial Columns">
    <Default>[today]</Default>
  </Field>

  <Field ID="{060E50AC-E9C1-4D3C-B1F9-DE0BCAC300F6}"
         Name="Amount"
         DisplayName="Amount"
         Type="Currency"
         Decimals="2"
         Min="0"
         Required="FALSE"
         Group="Financial Columns" />

  <Field ID="{943E7530-5E2B-4C02-8259-CCD93A9ECB18}"
         Name="CostCenter"
         DisplayName="Cost Center"
         Type="Choice"
         Required="FALSE"
         Group="Financial Columns">
    <CHOICES>
      <CHOICE>Administration</CHOICE>
      <CHOICE>Information</CHOICE>
      <CHOICE>Facilities</CHOICE>
      <CHOICE>Operations</CHOICE>
      <CHOICE>Sales</CHOICE>
      <CHOICE>Marketing</CHOICE>
    </CHOICES>
  </Field>

  <!-- Site Content Types -->

  <!-- Parent ContentType: Document (0x0101) -->
  <ContentType ID="0x0101000728167cd9c94899925ba69c4af6743e"
               Name="Financial Document"
               Group="Financial Content Types"
               Description="Base financial content type"
               Version="0">
    <FieldRefs>
      <FieldRef ID="{1511BF28-A787-4061-B2E1-71F64CC93FD5}" Name="DateOpened" DisplayName="Date" Required="TRUE"/>
      <FieldRef ID="{060E50AC-E9C1-4D3C-B1F9-DE0BCAC300F6}" Name="Amount" DisplayName="Amount" Required="FALSE"/>
    </FieldRefs>
  </ContentType>

  <!-- Parent ContentType: Financial Document -->
  <ContentType ID="0x0101000728167cd9c94899925ba69c4af6743e01"
               Name="Purchase Order"
               Group="Financial Content Types"
               Description="Used for creating purchase orders"
               Inherits="TRUE"
               Version="0">
    <FieldRefs>
      <FieldRef ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}" Name="Title" DisplayName="Item" Required="TRUE" Sealed="TRUE"/>
      <FieldRef ID="{943E7530-5E2B-4C02-8259-CCD93A9ECB18}" Name="CostCenter" DisplayName="Department" Required="TRUE"/>
    </FieldRefs>
  </ContentType>

</Elements>

Verweisen auf Spalten in Code

Alternativ zur Verwendung von deklarativem XML können Sie einen Inhaltstyp auch in der FeatureActivated-Methode einer Unterklasse der SPFeatureReceiver-Klasse erstellen. In den Code zur Erstellung des Inhaltstyps kann eine vorhandene Website oder Listenspalte oder eine neue Spalte, die von demselben Code erstellt wurde, mit dem der Inhaltstyp erstellt wird, eingeschlossen werden, indem auf die Spalte mit einem SPFieldLink-Objekt verwiesen wird. Wie bei deklarativem XML können Sie auch auf eine an den Inhaltstyp vererbte Spalte verweisen, um dessen Merkmale in dem Inhaltstyp zu ändern.

Es gibt auch andere Situationen, in denen Sie Code zum Verweisen auf eine Spalte in einem Inhaltstyp verwenden können. Beispielsweise möchten Sie einen vorhandenen Inhaltstyp durch Hinzufügen oder Entfernen von Spaltenverweisen aktualisieren. Oder Sie möchten eine Liste aus einer Listendefinition erstellen und dann einen Inhaltstyp in der Liste durch Hinzufügen oder Entfernen von Spalten ändern. In jedem Fall ist der Ansatz zur Verwendung des SharePoint Foundation-Objektmodells für den Verweis auf eine Spalte im Wesentlichen derselbe.

So erstellen Sie einen Spaltenverweis in Code

  1. Rufen Sie einen Verweis auf das SPField-Objekt ab, das das Feld darstellt, auf das Sie verweisen möchten.

    Sie können das SPField-Objekt aus der Auflistung in der Fields-Eigenschaft des SPWeb-Objekts abrufen, das die Website darstellt.

  2. Erstellen Sie ein SPFieldLink-Objekt für den Spaltenverweis, indem Sie das SPField-Objekt an den SPFieldLink-Konstruktor übergeben.

  3. Rufen Sie einen Verweis auf ein SPContentType-Objekt ab.

    Wenn Sie einen neuen Inhaltstyp erstellen, können Sie das vom Konstruktor der SPContentType-Klasse zurückgegebene Objekt verwenden. Wenn Sie einen vorhandenen Inhaltstyp ändern möchten, können Sie ein SPContentType-Objekt aus der Auflistung in der ContentTypes-Eigenschaft eines SPWeb- oder SPList-Objekts abrufen.

  4. Greifen Sie mithilfe der FieldLinks-Eigenschaft auf die Auflistung von Spaltenverweisen im SPContentType-Objekt zu. Diese Eigenschaft gibt ein SPFieldLinkCollection-Objekt zurück.

    HinweisHinweis

    Das SPContentType-Objekt verfügt auch über eine Fields-Eigenschaft, die ein SPFieldCollection-Objekt zurückgibt. Sie können dieser Auflistung nicht direkt Spalten hinzufügen. Wenn Sie der FieldLinks-Auflistung ein SPFieldLink-Objekt hinzufügen, wird der Fields-Auflistung automatisch ein entsprechendes SPField-Objekt hinzugefügt. Jedes SPField-Element in dieser Auflistung stellt eine "zusammengeführte Ansicht" der Basisspaltendefinition und aller überschriebenen Eigenschaften dar, die im Spaltenverweis angegeben sind.

  5. Fügen Sie dem Inhaltstyp den Spaltenverweis hinzu, indem Sie das SPFieldLink-Objekt an die Add-Methode des SPFieldLinkCollection-Objekts übergeben.

Beispiel

Das folgende Beispiel zeigt die FeatureActivated-Methode für eine von SPFeatureReceiver abgeleitete Klasse. Wenn das Feature aktiviert wird, werden vom Code in der FeatureActivated-Methode drei Websitespalten erstellt und der Websitespaltenauflistung auf der aktuellen Website hinzugefügt. Dann wird vom Code ein Inhaltstyp, Financial Document, erstellt und der Inhaltstypauflistung auf der aktuellen Website hinzugefügt. Der Financial Document-Inhaltstyp verweist auf zwei der neuen Websitespalten, DateOpened und Amount. Als Nächstes wird vom Code ein zweiter Inhaltstyp, Purchase Order, erstellt, der von Financial Document erbt. Im Purchase Order-Inhaltstyp wird auf eine geerbte Websitespalte, Title, verwiesen, um einige ihrer Eigenschaften im Inhaltstyp zu ändern. Darüber hinaus enthält der Purchase Order-Inhaltstyp einen Verweis auf eine der neuen Websitespalten, CostCenter.

Das Beispiel ist so geschrieben, als wäre der Featureempfänger Teil eines auf die Websitesammlungsebene beschränkten Features. Dies bedeutet, dass die Feature-Eigenschaft ein SPFeature-Objekt zurückgibt, dessen Parent-Eigenschaft ein geschachteltes SPSite-Objekt enthält. Sie sollten dieses Objekt in der FeatureActivated-Methode nicht verwerfen. Dagegen muss jedes vom Code erstellte SPWeb-Objekt ordnungsgemäß verworfen werden, wie in diesem Beispiel gezeigt.

public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
    SPSite siteCollection = (SPSite)properties.Feature.Parent;
    SPWeb site = siteCollection.RootWeb;

    /* CREATE SITE COLUMNS */

    string columnGroup = "Financial Columns";

    // Amount
    string amountFieldName = site.Fields.Add("Amount", SPFieldType.Currency, false);
    SPFieldCurrency amountField = (SPFieldCurrency)site.Fields.GetFieldByInternalName(amountFieldName);
    amountField.Group = columnGroup;
    amountField.DisplayFormat = SPNumberFormatTypes.TwoDecimals;
    amountField.MinimumValue = 0;
    amountField.Update();

    // Date Opened
    string dateOpenedFieldName = site.Fields.Add("Date Opened", SPFieldType.DateTime, false);
    SPFieldDateTime dateOpenedField = (SPFieldDateTime)site.Fields.GetFieldByInternalName(dateOpenedFieldName);
    dateOpenedField.Group = columnGroup;
    dateOpenedField.DisplayFormat = SPDateTimeFieldFormatType.DateOnly;
    dateOpenedField.DefaultValue = "[today]";
    dateOpenedField.Update();

    // Cost Center Name
    string costCenterFieldName = site.Fields.Add("Cost Center", SPFieldType.Choice, false);
    SPFieldChoice costCenterField = (SPFieldChoice)site.Fields.GetFieldByInternalName(costCenterFieldName);
    costCenterField.Choices.Add("Administration");
    costCenterField.Choices.Add("Information Services");
    costCenterField.Choices.Add("Facilities");
    costCenterField.Choices.Add("Operations");
    costCenterField.Choices.Add("Sales");
    costCenterField.Choices.Add("Marketing");
    costCenterField.Group = columnGroup;
    costCenterField.Update();

    /* CREATE SITE CONTENT TYPES */

    string contentTypeGroup = "Financial Content Types";

    // Get a content type to be the parent of a new Financial Document content type.
    SPContentType documentCType = site.AvailableContentTypes[SPBuiltInContentTypeId.Document];

    // Create the Financial Document content type.
    SPContentType financialDocumentCType = new SPContentType(documentCType, site.ContentTypes, "Financial Document");
    site.ContentTypes.Add(financialDocumentCType);

    // Note: A content type is not initialized until after it is added.
    financialDocumentCType = site.ContentTypes[financialDocumentCType.Id];
    financialDocumentCType.Group = contentTypeGroup;

    // Add the Date Opened column. Child content types inherit the column.
    SPFieldLink dateOpenedFieldRef = new SPFieldLink(dateOpenedField);
    dateOpenedFieldRef.Required = true;
    financialDocumentCType.FieldLinks.Add(dateOpenedFieldRef);

    // Add the Amount column. Child content types inherit the column.
    SPFieldLink amountFieldRef = new SPFieldLink(amountField);
    financialDocumentCType.FieldLinks.Add(amountFieldRef);

    // Commit changes.
    financialDocumentCType.Update();

    // Create the Purchase Order content type.
    SPContentType purchaseOrderCType = new SPContentType(financialDocumentCType, site.ContentTypes, "Purchase Order");
    site.ContentTypes.Add(purchaseOrderCType);
    purchaseOrderCType = site.ContentTypes[purchaseOrderCType.Id];
    purchaseOrderCType.Group = contentTypeGroup;

    // Modify the Title column inherited from the parent.
    SPFieldLink itemFieldRef = purchaseOrderCType.FieldLinks[SPBuiltInFieldId.Title];
    itemFieldRef.DisplayName = "Item";
    itemFieldRef.Required = true;

    // Add the Department column.
    SPFieldLink departmentFieldRef = new SPFieldLink(costCenterField);
    departmentFieldRef.DisplayName = "Department";
    departmentFieldRef.Required = true;
    purchaseOrderCType.FieldLinks.Add(departmentFieldRef);

    // Commit changes.
    purchaseOrderCType.Update();

    site.Dispose();
}
Public Overrides Sub FeatureActivated(ByVal properties As SPFeatureReceiverProperties)
    Dim siteCollection As SPSite = DirectCast(properties.Feature.Parent, SPSite)
    Dim site As SPWeb = siteCollection.RootWeb
    
    ' CREATE SITE COLUMNS 

    Dim columnGroup As String = "Financial Columns"
    
    ' Amount
    Dim amountFieldName As String = site.Fields.Add("Amount", SPFieldType.Currency, False)
    Dim amountField As SPFieldCurrency = DirectCast(site.Fields.GetFieldByInternalName(amountFieldName), SPFieldCurrency)
    amountField.Group = columnGroup
    amountField.DisplayFormat = SPNumberFormatTypes.TwoDecimals
    amountField.MinimumValue = 0
    amountField.Update()
    
    ' Date Opened
    Dim dateOpenedFieldName As String = site.Fields.Add("Date Opened", SPFieldType.DateTime, False)
    Dim dateOpenedField As SPFieldDateTime = DirectCast(site.Fields.GetFieldByInternalName(dateOpenedFieldName), SPFieldDateTime)
    dateOpenedField.Group = columnGroup
    dateOpenedField.DisplayFormat = SPDateTimeFieldFormatType.DateOnly
    dateOpenedField.DefaultValue = "[today]"
    dateOpenedField.Update()
    
    ' Cost Center Name
    Dim costCenterFieldName As String = site.Fields.Add("Cost Center", SPFieldType.Choice, False)
    Dim costCenterField As SPFieldChoice = DirectCast(site.Fields.GetFieldByInternalName(costCenterFieldName), SPFieldChoice)
    costCenterField.Choices.Add("Administration")
    costCenterField.Choices.Add("Information Services")
    costCenterField.Choices.Add("Facilities")
    costCenterField.Choices.Add("Operations")
    costCenterField.Choices.Add("Sales")
    costCenterField.Choices.Add("Marketing")
    costCenterField.Group = columnGroup
    costCenterField.Update()
    
    ' CREATE SITE CONTENT TYPES 
    
    Dim contentTypeGroup As String = "Financial Content Types"
    
    ' Get a content type to be the parent of a new Financial Document content type.
    Dim documentCType As SPContentType = site.AvailableContentTypes(SPBuiltInContentTypeId.Document)
    
    ' Create the Financial Document content type.
    Dim financialDocumentCType As New SPContentType(documentCType, site.ContentTypes, "Financial Document")
    site.ContentTypes.Add(financialDocumentCType)
    
    ' Note: A content type is not initialized until after it is added.
    financialDocumentCType = site.ContentTypes(financialDocumentCType.Id)
    financialDocumentCType.Group = contentTypeGroup
    
    ' Add the Date Opened column. Child content types inherit the column.
    Dim dateOpenedFieldRef As New SPFieldLink(dateOpenedField)
    dateOpenedFieldRef.Required = True
    financialDocumentCType.FieldLinks.Add(dateOpenedFieldRef)
    
    ' Add the Amount column. Child content types inherit the column.
    Dim amountFieldRef As New SPFieldLink(amountField)
    financialDocumentCType.FieldLinks.Add(amountFieldRef)
    
    ' Commit changes.
    financialDocumentCType.Update()
    
    ' Create the Purchase Order content type.
    Dim purchaseOrderCType As New SPContentType(financialDocumentCType, site.ContentTypes, "Purchase Order")
    site.ContentTypes.Add(purchaseOrderCType)
    purchaseOrderCType = site.ContentTypes(purchaseOrderCType.Id)
    purchaseOrderCType.Group = contentTypeGroup
    
    ' Modify the Title column inherited from the parent.
    Dim itemFieldRef As SPFieldLink = purchaseOrderCType.FieldLinks(SPBuiltInFieldId.Title)
    itemFieldRef.DisplayName = "Item"
    itemFieldRef.Required = True
    
    ' Add the Department column.
    Dim departmentFieldRef As New SPFieldLink(costCenterField)
    departmentFieldRef.DisplayName = "Department"
    departmentFieldRef.Required = True
    purchaseOrderCType.FieldLinks.Add(departmentFieldRef)
    
    ' Commit changes.
    purchaseOrderCType.Update()
    
    site.Dispose()
End Sub

Siehe auch

Aufgaben

Gewusst wie: Hinzufügen einer Spalte zu einer Website

Referenz

FieldRef-Element (ContentType)

Konzepte

Felder und Feldverweise

Einführung in Spalten