SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




Erstellen einer SiteColumn mit LookUp per SiteDefinition

Unbeantwortet Dieser Beitrag hat 9 Antworten

Ohne Rang
194 Beiträge
Florian Lippert erstellt 16 Apr. 2014 09:52
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Moin Moin Community,

ich bin momentan dabei eine Seite per SiteDefinition zu erzeugen und zu installieren.

Bisher klappt das alles wunderbar und ohne Probleme.

Verschiedene SiteColumns habe ich bereits angelegt, auch mir LookUps auf Listen die ich in der SiteDef mit anlege.

Hier verwende ich das "List=Lists/listname" Attribut und den Type="Lookup" bzw. "Lookupmulti" (inkl. Multi="TRUE"). Diese Columns werden alle richtig angelegt und enthalten auch die Referenz auf die gewünschte Liste.

ABER: nun habe ich eine DokumentenLibrary die ich gerne in dem LookUp verknüpft haben will - diese Library nennt sich "downloads".

Wenn ich in der SiteColumn diese Library wie eine Liste (s.o.) angebe, habe ich in der installierten Column KEINE Referenz mehr drin. Versucht habe ich es schon mit "downloads", "Lists/downloads" und der GUID der Liste. Die GUID wird jedoch bei jeder installation neu erzeugt, so dass diese in dem moment wieder ungültig wird.

Hat jemand eine Idee wie ich dies umgehen kann?

Danke & VG

Florian

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 16 Apr. 2014 10:04
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Bei Bibliotheken fehlt ja i.d.R. der Lists-Ordner in der Adresse. Wenn die Bibliothek ebenfalls von Dir angelegt wird, kannst Du sie aber problemlos als Lists/downloads anlegen. Sonst kannst Du es noch mit "/downloads" oder "downloads/" oder sowas versuchen. Ich habe aber keine Ahnung, ob das geht.

Ich behelfe mir in einem solchen Fall immer damit, daß ich das Lookup per Code im FeatureActivated erzeuge. Das klappt in jedem Fall.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
194 Beiträge
Florian Lippert Als Antwort am 16 Apr. 2014 12:16
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hi Andi,

danke dir für deine Antwort :)

Ich habe folgende Sachen nun probiert:

- angelegt als "Lists/donwloads"

- angelegt mit "/downloads"

- angelegt mit "downloads/"

Alles ohne Erfolg...

 

Könntest du mir nen kurzes Beispiel geben wie ich in dem Event dann ans LookUp komme?

 

Danke & VG

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 16 Apr. 2014 12:22
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Wenn Du die Bibliothek unter der Adresse Lists/downloads anlegst und dann bei der Spalte im XML List="Lists/downloads", dann funktioniert es wie bei anderen Listen auch. Die Frage ist dabei nur, ob man das zusätzliche Lists/ in der Adresse der Bibliothek haben möchte. Es geht wie gesagt, weicht aber vom Standard ab.

[quote user="Florian Lippert"]Könntest du mir nen kurzes Beispiel geben wie ich in dem Event dann ans LookUp komme?[/quote]

Andresrum: Dein Feature hat ein FeatureActivated-Event, in das Du eigenen Code schreiben kannst. Falls es noch nicht vorhanden ist, mache einen Rechtsklick auf das Feature und dann "Add Event Receiver". Holde Dir dort die passende SPFieldCollection (Websitespalten vom Web, Listenspalten von der Liste) und benutze SPFieldCollection.AddLookup(...)

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
194 Beiträge
Florian Lippert Als Antwort am 22 Apr. 2014 11:46
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Wenn ich die Spalte nun erst im Receiver hinzufüge, muss ich dann diese neue Spalte den ContentTypes ebenfalls an dieser Stelle zuweisen?

Ich hab ja keinen einfluss auf die GUID die ich normalerweise im CT eintrage um diese zu referenzieren....

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 22 Apr. 2014 12:25
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Florian Lippert"]Wenn ich die Spalte nun erst im Receiver hinzufüge, muss ich dann diese neue Spalte den ContentTypes ebenfalls an dieser Stelle zuweisen?[/quote]

Ja, sie ist ja vorher nicht bekannt.

[quote user="Florian Lippert"]Ich hab ja keinen einfluss auf die GUID die ich normalerweise im CT eintrage um diese zu referenzieren[/quote]

Auf die ID hast Du tatsächlich keinen Einfluß, aber sehr wohl auf den InternalName und der tut es ebenfalls als unveränderlicher Identifizierer.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
194 Beiträge
Florian Lippert Als Antwort am 22 Apr. 2014 13:36
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Danke für deine Hilfe Andi :)

Wäre dann diese Lösung richtig?

Guid guidOfDownloadList = site.Lists["downloads"].ID;
string fieldName = "MyFieldName";
((SPFieldLookup)site.Fields[fieldName]).AllowMultipleValues = true;
((SPFieldLookup)site.Fields[fieldName]).LookupField = "ID";
site.ContentTypes["MyCtName"].Fields.Add(site.Fields.GetFieldByInternalName(fieldName));

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 22 Apr. 2014 13:55
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Fast richtig ;-)

Grundsätzlich solltest Du die Objekte in Variablen zwischenspeichern und nicht mehrfach aus den Collections holen. Also z.B. so:

SPFieldLookup lookup = (SPFieldLookup)site.Fields[fieldName];
lookup.AllowMultipleValues = true;
lookup.LookupField = "ID";
// usw.

Damit Änderungen auch gespeichert werden, mußt Du die Update-Methode aufrufen. Das gilt grundsätzlich für so ziemlich alle SharePoint-Objekte. Also zum Schluß noch:
lookup.Update();

Und zum Hinzufügen eines Felds zu einem Inhaltstyp mußt Du einen FieldLink hinzufügen:
myContentType.FieldLinks.Add(new SPFieldLink(lookup));

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
194 Beiträge
Florian Lippert Als Antwort am 25 Apr. 2014 16:16
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Muss ich noch was beachten, damit die Änderung auch bis in die Liste durchgesetzt wird?

Mein CT in der Liste hat die neue Spalte noch nicht erhalten :(

 

Ich habe nun diese Lösung ergänzt:

site.ContentTypes[new SPContentTypeId("0x01002a5aec50ce43430c91ce2ecf95da665700adc1e6626eaa414f9bb2cb8e87bd21b5")].FieldLinks.Add(new SPFieldLink(myLookUp));
site.ContentTypes[new SPContentTypeId("0x01002a5aec50ce43430c91ce2ecf95da665700adc1e6626eaa414f9bb2cb8e87bd21b5")].Update();

Bei der angezeigten ID handelt es sich um die ID in meiner Elements.xml des CTs.

<ContentType ID="0x01002a5aec50ce43430c91ce2ecf95da665700adc1e6626eaa414f9bb2cb8e87bd21b5"
               Name="MyName"
               Group="MyGroup"
               Overwrite="TRUE"
               Inherits="TRUE"
               Version="0">

 

Danke & schönes Wochenende :)

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 27 Apr. 2014 11:53
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

SPContentType.Update() hat eine Überladung, bei der Du einen booleschen Wert mitgeben kannst. Wenn Du den auf true setzt, werden die Änderungen auch nach unten weitergegeben.

Viele Grüße
Andi
af @ evocom de
Blog