Erstellen von verknüpften Datenblatt-WebParts in einer Site Definition
Das folgende Beispiel zeigt wie man innerhalb einer Site Definition und dem programmatischen Erzeugen einer SharePoint Services (2.0) Site zwei WebParts in Datenblattansicht miteinander verknüpft.
In diesem Beispiel verwende ich zwei Listen, für die jeweils eine neue Ansicht in der schema.xml definiert wird:
<view BaseViewID=”2″ OrderedView=”TRUE” Type=”GRID”>
…
</view>
Wichtig sind hier die Angaben BaseViewID=”2″ (zur späteren Referenzierung beim Hinzufügen des WebParts in der onet.xml) und Type=”GRID” (damit die Ansicht standardmäßig als Datenblatt geladen wird).
Die WebParts selber werden innerhalb eines Moduls in der Datei onet.xml festgelegt:
<module Name=”datasheet_wps” Path=”DOCTEMP\SMARTPGS”>
<file Url=”spstd1.aspx” Name=”datasheet_wps.aspx” Type=”Ghostable”>
<view List=”501″ WebPartZoneID=”Main” WebPartOrder=”1″ BaseViewID=”2″></view>
<view List=”502″ WebPartZoneID=”Main” WebPartOrder=”2″ BaseViewID=”2″></view>
</file>
</module>
Innerhalb der View-Tags werden nun die weiter oben beschriebenen Listen mit der zugehörigen ID (501 und 501) angesprochen und als Standardansicht die gewünschte Datenblattansicht mit der BaseViewID 2 gewählt.
Beim Erstellen einer neuen SharePoint Site auf Basis dieser Site Definition wird nun (vorausgesetzt das Modul wird entsprechenden im Configuration-Tag geladen) eine neue aspx-Seite (datasheet_wps.aspx) erzeugt, die genau die zwei Listen-WebParts enthält. Da diese aber untereinander noch nicht verbunden sind, muss dies noch innerhalb eines Code-Abschnitts nach dem Erstellen der Site erfolgen. Voraussetzung ist natürlich, dass die Site ebenfalls programmatisch erzeugt wurde.
SPWebPartCollection wpc = web.GetWebPartCollection(web.Url + “/datasheet_wps.aspx”,Storage.Shared);
wpc[0].ConnectionID = new Guid(“00000000-0000-0000-0000-000000000001″);
wpc.SaveChanges(wpc[0].StorageKey);
wpc[1].ConnectionID = new Guid(“00000000-0000-0000-0000-000000000002″);
wpc[1].Connections = “00000000-0000-0000-0000-000000000002,
00000000-0000-0000-0000-000000000001,
ListViewFilterConsumer_WPQ_,ListViewRowProvider_WPQ_,
ListViewFilterConsumer_WPQ_,ListViewRowProvider_WPQ_,
field_consumer=field_provider”;
wpc.SaveChanges(wpc[1].StorageKey);
Voraussetzung für das Funktionieren des Codes ist ein gültiges SPWeb-Objekt (web), das die eben erzeugte Site referenziert, sowie das Vorhandensein der datasheet_wps.aspx-Seite, die die zwei WebParts in folgender Reihenfolge beinhalten muss: An erster Stelle die Liste, die den Filter vorgibt und an zweiter Stelle die Liste, die den Filter ausführt.
Für jedes WebPart muss eine (auf dieser Seite) eindeutige ID festgelegt werden. Für ein beliebiges WebPart muss außerdem der Connections-String gesetzt werden, der folgende Angaben erwartet (siehe auch http://msdn2.microsoft.com/en-us/library/microsoft.sharepoint.webpartpages.webpart.connections.aspx):
- ID des “Consumer” WebParts
- ID des “Provider” WebParts
- Name des “Consumer” Interfaces (legt die Art der Verbindung fest, hier: das Feld, nach dem gefiltert werden soll)
- Name des “Provider” Interfaces (muss passend zum “Consumer” Interface sein, hier: Datenzeile, die für die Filter-Id angezeigt werden soll)
- Name des “Consumer” Interfaces (siehe oben)
- Name des “Provider” Interfaces (siehe oben)
- Beziehung des Verbindung, sprich: das Feld des Providers in Beziehung zum Feld des Consumers
Damit alle Änderungen in die Datenbank geschrieben werden, muss für jedes WebPart die Methode SaveChanges der SPWebPartCollection aufgerufen werden.