Bei einem Projekt wurde gefordert, dass wir ein kleines Bestellwesen für Büromaterial auf einer Seite eines SharePoint-Portals implementieren. 'Keine große Sache' dachte ich mir und begann mit dem Design. Das Bestellwesen sollte auf einer einfachen SharePoint-Liste basieren und die Benachrichtigungen an die User sollten über Workflows erfolgen, die mit dem SharePoint-Designer erstellt werden. Wie gesagt - keine große Sache! (Anmerkung: die Anforderungen an das Bestellwesen waren natürlich größer, als hier dargestellt. Es soll hier nur als Beispiel dienen.)
Die Probleme begannen aber, als ich mir Gedanken über ein Status-Feld machte. Zu jeder Bestellung sollte es ein Status-Feld geben, in dem der Status der Bestellung (z.B. offen / genehmigt / bestellt / eingetroffen / abgelehnt) hinterlegt ist. Dieses Statusfeld sollte auch als Trigger für die Workflows benutzt werden. Gepflegt werden sollte dieses Statusfeld ausschließlich vom Sekretariat, weil hier auch die Bestellungen bearbeitet werden. Ein Mitarbeiter sollte nur eine neue Bestellung aufgeben, nicht aber seine Bestellung -und somit das Statusfeld- nachträglich bearbeiten können.
Somit war das Problem klar: bei der Eingabe einer neuen Bestellung sollte das Feld (bzw. die Spalte) 'Status' nicht veränderbar sein, beim Bearbeiten einer Bestellung hingegen schon. Beim Ansehen einer Bestellung sollte der Status natürlich auch ganz normal angezeigt werden.
Nach einigem Recherchieren und dem Hinweis eines Entwicklerkollegen habe ich eine Lösung gefunden.
SharePoint verwendet spezielle Forms, wenn Daten einer Liste hinzugefügt, editiert oder betrachtet werden. Beim Eingeben eines neuen Datensatzes in eine Liste wird die Form NewForm.aspx verwendet, beim Editieren eines Datensatzes wird EditForm.aspx verwendet und beim Betrachten eines Datensatzes wird DispForm.aspx verwendet.
Für das geschilderte Problem wäre es hilfreich, wenn die Status-Spalte nur bei 'EditForm' und 'DispForm' angezeigt werden würde, nicht aber bei 'NewForm'. Mitarbeiter verwenden beim Aufgeben einer neuen Bestellung 'NewForm'. Das Sekretariat verwendet 'EditForm' zum Ändern des Wertes der Status-Spalte (Mitarbeiter können eine einmal aufgegebene Bestellung nicht mehr verändern) und beide verwenden 'DispForm', um sich über den Stand einer Bestellung zu informieren.
Leider findet man eine entsprechende Einstellmöglichkeit nicht in den Eigenschaften einer SharePoint-Liste oder Bibliothek. Dennoch ist es aber möglich, für einzelne Listen festzulegen, welche Spalten in welcher Form angezeigt werden sollen - ein Blick in das SDK bzw. das Objektmodell von SharePoint hilft hier weiter.
Eine Liste wird im SharePoint-Objektmodell durch das Objekt SPList repräsentiert. Spalten werden durch das Objekt SPField repäsentiert und alle Spalten einer Liste werden in der Collection Fields des Objekts SPList zusammengefasst.
Um eine spezielle Spalte bzw. deren SPField-Objekt aus dieser Collection zu bekommen, gibt es zwei Möglichkeiten. Die erste Möglichkeit besteht im bekannten Array-Zugriff (z.B. Fields["Status"]). Hierbei ist zu beachten, dass als Spaltenname der sprachabhängige Anzeigename (display name) verwendet wird. Die zweite Möglichkeit besteht darin, die Methode GetFieldByInternalName() der Collection Fields aufzurufen. Wie der Methodenname schon vermuten läßt, wird hier nicht der sprachabhängige Anzeigename als Parameter verwendet, sondern der sprachunabhängige interne Spaltenname (internal name). Die Unterscheidung zwischen display name und internal name ist also sehr wichtig und sollte bei der Programmierung beachtet werden!
Hat man nun das gewünschte SPField-Objekt und schaut es sich etwas genauer an, findet man u.a. diese drei Eigenschaften: ShowInEditForm, ShowInNewForm und ShowInDisplayForm. Alle drei sind vom Typ bool und sind standardmäßig auf null gesetzt. Um eine Spalte z.B. in der NewForm auszublenden, setzt man einfach die Eigenschaft ShowInNewForm der entsprechenden Spalte auf false. Um eine bestimmte Spalte wieder einzublenden, setzt man die entsprechende Eigenschaft auf true und um die Eigenschaft wieder auf ihren Standardwert zurückzusetzen, weist man dieser den Wert null zu. Diese Einstellungen brauchen nur ein einziges Mal vorgenommen zu werden, da sie wie alle anderen Listeneigenschaften auch gespeichert werden.
Zur Illustration (und weil ich es sicherlich auch noch öfters brauchen werde) habe ich eine kleine Windows-Applikation geschrieben (siehe Screenshot). Nach dem Starten der Applikation wählt man eine Site und eine Liste aus. Jetzt werden alle Spalten der ausgewählten Liste angezeigt und man kann einstellen, bei welcher Form welche Spalte angezeigt bzw. ausgeblendet werden soll. Zusätzlich kann man noch die Breite der Spalte (für NewForm und EditForm) einstellen und festlegen, ob diese read only sein soll. Um die Sache mit den unterschiedlichen Spaltenname (display name und internal name) zu verdeutlichen, kann zwischen beiden umgeschaltet werden. Dieses Tool kann man sich von unserer Homepage kostenlos (gegen eine kleine Registrierung) herunterladen - hier der Link.
Ich möchte an dieser Stelle noch erwähnen, dass es sich hierbei um ein Entwickler-Tool, welches direkt auf einem SharePoint-Server gestartet werden muss, handelt. Es dient ausschließlich als Anschauungsobjekt, kann und die Benutzung erfolgt auf eigenes Risiko!
Das SPField Objekt bietet aber noch einige weitere interessante Eigenschaften und Methoden. In nächster Zeit werde ich mich sicherlich noch mehrmals mit dem SPField Objekt beschäftigen. Weitere Erkenntnisse oder Updates zum genannten Tool werde ich dann hier posten.