Vorgehensweise: Erstellen einer benutzerdefinierten Feldwertklasse
Letzte Änderung: Montag, 5. April 2010
Gilt für: SharePoint Foundation 2010
Inhalt dieses Artikels
Mit benutzerdefinierten Feldwertklassen verwendete Konstruktoren
Verwenden der [Serializable]-Direktive
Zugreifen auf benutzerdefinierte Feldwerte aus der benutzerdefinierten Feldklasse
Wenn Sie eine benutzerdefinierte Feldklasse erstellen, bei der eine spezielle Datenstruktur für die Felddaten erforderlich ist, und diese Struktur nicht von der übergeordneten Feldklasse unterstützt wird, von der die benutzerdefinierte Feldklasse abgeleitet wird, können Sie eine Feldwertklasse erstellen, die die Felddaten enthält.
![]() |
---|
Beim benutzerdefinierten Datentyp kann es sich um eine Struktur oder um eine Klasse handeln. Um jedoch die Anweisungen zu vereinfachen, wird im Microsoft SharePoint Foundation 2010 Software Development Kit (SDK) in jedem Fall davon ausgegangen, dass eine Klasse verwendet wird. |
Sie müssen die benutzerdefinierte Feldwertklasse nicht von einer bestimmten Klasse ableiten. Dies gilt selbst für benutzerdefinierte Feldklassen, die von Feldklassen abgeleitet sind, die bereits Feldwertklassen zugeordnet wurden. Wenn Sie beispielsweise eine benutzerdefinierte Feldwertklasse erstellen, die von der SPFieldMultiColumn-Klasse erbt, muss eine Feldwertklasse für diese benutzerdefinierte Feldklasse nicht von der SPFieldMultiColumnValue-Klasse erben.
Es empfiehlt sich, die folgende Benennungskonvention für benutzerdefinierte Wertklassen zu verwenden:
FeldtypnameFieldValue
Beispiele ordnungsgemäß benannter Klassen sind TargetDateFieldValue oder RegularExpressionFieldValue. (Die speziellen im Lieferumfang von SharePoint Foundation enthaltenen Wertklassen wurden erstellt, bevor diese Benennungskonvention festgelegt wurde. Sie folgen dem Muster SPFieldFeldtypnameValue, beispielsweise SPFieldMultiColumnValue.)
Mit benutzerdefinierten Feldwertklassen verwendete Konstruktoren
Von einer benutzerdefinierten Feldwertklasse müssen mindestens zwei Konstruktoren implementiert werden, und normalerweise müssen nur zwei implementiert werden. In den meisten Fällen weist ein Konstruktor keine Parameter auf, während der andere einen String-Parameter annimmt. Der zweite Konstruktor konvertiert den String in einen Wert des benutzerdefinierten Typs. Wenn der benutzerdefinierte Typ komplex ist, muss String über eine Struktur verfügen, die analysiert werden kann.
Wenn die Klasse von einer der SPFieldFeldtypnameValue-Klassen abgeleitet ist, rufen diese Konstruktoren normalerweise nur den Basiskonstruktor auf. Im Folgenden finden Sie ein Beispiel für typische Konstruktoren einer Wertklasse, wenn die Wertklasse von einer anderen Klasse abgeleitet ist:
public RegularExpressionFieldValue()
: base() { }
public RegularExpressionFieldValue(string value)
: base(value) { }
Public Sub New()
MyBase.New()
End Sub
Public Sub New(ByVal value As String)
MyBase.New(value)
End Sub
In einigen Fällen sind zusätzliche Konstruktoren erforderlich. Wenn der benutzerdefinierte Typ beispielsweise auf einem internen Arrayfeld basiert, empfiehlt sich ein Konstruktor, der mit einem Int32-Parameter die Größe des Arrays initialisiert, jedoch keine bestimmten Member des Arrays. Möglicherweise benötigen Sie auch zusätzliche Parameter für die beiden Basiskonstruktoren. Wenn die Werte des benutzerdefinierten Typs beispielsweise eine kontextbezogene Komponente enthalten, müssen Sie ggf. einen SPContext-Parameter oder evtl. einen SPWeb-Parameter bzw. SPSite-Parameter hinzufügen. Beispiele finden Sie unter den Konstruktoren der SPFieldFeldtypnameValue-Klassen.
Verwenden der [Serializable]-Direktive
Fast jeder Deklaration einer Feldwertklasse muss die [Serializable]-Direktive hinzugefügt werden, sodass ihre Objekte serialisiert werden können. Daher sollten Sie diese ebenfalls der Deklaration Ihrer benutzerdefinierten Feldwertklasse hinzufügen. Dies ist jedoch nicht erforderlich, wenn die Objektwerte der Klasse in einer Weise kontextbezogen sind, dass die Objektwerte nicht sinnvoll beibehalten und wiederhergestellt werden können. SPFieldLookupValue stellt ein Beispiel einer Feldwertklasse dar, in deren Deklaration die [Serializable]-Direktive nicht verwendet wird. Werte dieses Typs sind immer temporär.
Wenn Sie die Klasse mit der [Serializable]-Direktive markieren, müssen Sie die ToString-Methode implementieren, um den Feldwert in ein Zeichenfolgenformat zu konvertieren, das für die Datenspeicherung verwendet wird. (Sie müssen die Methode jedoch nicht unbedingt überschreiben, wenn die Klasse von einer anderen Feldwertklasse erbt.)
![]() |
---|
Die serialisierbaren SPFieldFeldtypnameValue-Klassen im Lieferumfang von SharePoint Foundation überschreiben generell die ToString-Methode, anstatt die ISerialization-Klasse zu implementieren. Es wird empfohlen, das folgende Muster zu befolgen: Implementieren Sie nicht die ISerialization-Schnittstelle. |
Weitere Informationen zum SerializableAttribute finden Sie unter SerializableAttribute.
Zugreifen auf benutzerdefinierte Feldwerte aus der benutzerdefinierten Feldklasse
Benutzerdefinierte Feldklassen, die benutzerdefinierte Feldwertklassen erfordern, müssen normalerweise eine oder mehrere Methoden und Eigenschaften der SPField-Klasse überschreiben, insbesondere diejenigen, die die benutzerdefinierten Feldwertobjekte lesen oder schreiben.
![]() |
---|
Für die meisten dieser Member wird durch die Implementierung in SPField kein nützlicher Vorgang ausgeführt. GetFieldValue gibt beispielsweise lediglich die Eingabe zurück, und GetValidatedString ruft einfach die ToString-Methode der Wertklasse auf (die keine Validierungslogik enthält). Wenn die Feldtypklasse direkt von SPField abgeleitet ist, müssen Sie daher Überschreibungen für die Member bereitstellen, die für den gewünschten Zweck verwendet werden sollen. Es wird empfohlen, benutzerdefinierte Feldklassen nach Möglichkeit von einer Klasse abzuleiten, die von SPField abgeleitet sind. |
DefaultValue: Gibt einen Standardwert als Zeichenfolge zurück, der für das Feld verwendet werden kann, wenn für ein bestimmtes Listenelement kein Wert im Feld vorhanden ist.
DefaultValueTyped: Gibt einen Standardwert zurück, der für das Feld verwendet werden kann, wenn für ein bestimmtes Listenelement kein Wert im Feld vorhanden ist.
FieldValueType: Gibt den Feldwerttyp zurück.
GetFieldValue: Konvertiert die angegebene Zeichenfolge in ein Feldtypwert-Objekt. Das benutzerdefinierte Feldobjekt muss das benutzerdefinierte Feldwertobjekt zurückgeben, wenn die M:Microsoft.SharePoint.SPField.GetFieldValue(System.String)-Methode aufgerufen wird. SharePoint Foundation gibt dieses Feldwertobjekt zurück, wenn die SPListItem.this["field name"]-Methode aufgerufen wird. Wenn verifiziert wurde, dass der String nicht leer oder NULL ist, muss eine Überschreibung dieser Methode häufig nur den Konstruktor der benutzerdefinierten Feldwertklasse aufrufen, der einen Zeichenfolgenparameter annimmt (siehe oben).
GetFieldValueAsText: Gibt den Felddatenwert als Zeichenfolge zurück.
GetFieldValueAsHtml: Gibt den Felddatenwert als Zeichenfolge zurück, die als HTML formatiert ist. Mit diesem HTML-formatierten Feldwert wird der Feldwert häufig direkt auf einer Seite gerendert. Er wird beispielsweise auf der Versionsverlaufsseite eines Listenelements verwendet. Dieser HTML-formatierte Feldwert wird jedoch nicht auf dem Formular Anzeigen verwendet. Das Rendern von Feldern für das Formular Anzeigen entspricht normalerweise dem Rendern für Listenansichten. Das heißt, das Rendering erfolgt aus dem Collaborative Application Markup Language (CAML) DisplayPattern-Element in der Datei fldtype*.xml des Feldtyps.
GetValidatedString: Diese Methode validiert das Feldtypwert-Objekt und konvertiert es in eine serialisierte Zeichenfolge. Diese Methode kann wiederum die ToString-Methode des Feldwertobjekts verwenden, um das Feldwertobjekt in eine Zeichenfolge zu konvertieren.
PreviewValueTyped: Gibt einen Vorschauwert von Felddaten für eine Entwurfszeitansicht des Feldsteuerelements im Anzeige- und Bearbeitungsmodus zurück.
Siehe auch
Aufgaben
Exemplarische Vorgehensweise: Erstellen eines benutzerdefinierten Feldtyps