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.




Bereits im Vorher-Event das properties.ListItem ändern

Unbeantwortet Dieser Beitrag hat 4 Antworten

Ohne Rang
10 Beiträge
learning2010 erstellt 18 Juni 2010 09:02
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Leute,

ich habe mal wieder ein Problem, an dem ich jetzt unglaublich lange hänge und keine Lösung finde.

Ich habe einen EventHandler, der bei einem Feld namens "Teilnehmer" anspringt. Dies ist eine SPFieldUserValueCollection (Auswahl verschiedener SharePoint-Benutzer).

Im Prinzip möchte ich die Änderungen mitkriegen, wenn jemand in diesem Feld z.B. zwei Teilnehmer rauslöscht oder einen neuen hinzufügt. Um aber die Änderungen mitzukriegen, sehe ich nur die Möglichkeit, mir immer den letzten Zustand des Feldinhalts zu merken (und zwar wiederum in einem verstecken Feld, nennen wir es mal "Teilnehmer_before").

In "ItemUpdating()" versuche ich nun folgendes:

 

DisableEventFiring();

[...]

if(properties.ListTitle == "Kalender") {

    properties.ListItem["teilnehmer_before"] = properties.AfterProperties["Teilnehmer"];  // Alten Zustand retten
    properties.ListItem.Update();
}

EnableEventFiring();


Da ich ja im EventHandler selber das ListItem nochmal ändere, steht ein "DisableEventFiring()"-Block drumherum, aber es funktioniert trotzdem nicht.

 

Heraus kommt folgendes beim Absenden des Formulars:

Konflikt beim Speichern

Die von Ihnen vorgenommenen Änderungen stehen im Konflikt zu gleichzeitig von einem anderen Benutzer durchgeführten Änderungen.

Wichtig zu erwähnen: Nach dem "ItemUpdating()"-Aufruf erfolgt danach auch ein "ItemUpdated()"-Aufruf. In diesem werde ich dann auch "Teilnehmer" sowie "teilnehmer_before" auswerten um die Unterschiede rauszubekommen. Hängt dies vielleicht in irgend einer Weise daran?

Ich bin für jede Hilfe äußerst dankbar. Ich habe eigentlich schon viele Probleme mit meinen EventHandlern lösen können, aber hier stehe ich irgendwie auf dem Schlauch   :-/

Alle Antworten

Ohne Rang
168 Beiträge
niceoldlady Als Antwort am 18 Juni 2010 09:21
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Debug doch mal das ganze und finde geraus in welcher Quelltextzeile der Fehler auftaucht. Meine Vermutung ist, sofern du im Updated- Event was änderst, dass der Fehler da auftritt, wenn du Änderungen vornimmst die die Eingaben des Nutzers kaputt machen. Vielleciht reicht es auch wenn du auf der WebSeite AllowUnsafeUpdates auf true setzt.

 

edit:

nach genauerem hinsehen ist der fehler eher:

properties.ListItem["teilnehmer_before"] = properties.AfterProperties["Teilnehmer"];  // Alten Zustand retten
    properties.ListItem.Update();

änder das mal in:

properties.AfterProperties["teilnehmer_before"] = properties.AfterProperties["Teilnehmer"];  // Alten Zustand retten
    properties.ListItem.Update();

Ohne Rang
1714 Beiträge
C.Kaiser Als Antwort am 18 Juni 2010 09:23
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Neben den ".AfterProperties" gibt es doch auch den Punkt ".BeforeProperties" wenn ich mich nicht ganz täusche. Kannst du damit nicht gegeneinander vergleichen, dann bräuchtest du kein Hilfsfeld.

Beste Grüße,
Christian

http://www.sharepoint-rhein-ruhr.de

Ohne Rang
168 Beiträge
niceoldlady Als Antwort am 18 Juni 2010 09:24
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das BeforeProperties Feld gibt es aber nicht im Updated- Event.

Ohne Rang
10 Beiträge
learning2010 Als Antwort am 18 Juni 2010 10:30
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich glaube ich habs endlich !!!!!!!! Nach zig Tagen/Wochen.

Meine Bedingungen (Liste Kalender ist die Liste, mit der ich arbeite).
Wird das Feld "Teilnehmer" nicht ausgefüllt (also leer), wird standardmäßig immer der Benutzer als Teilnehmer eingetragen, der gerade angemeldet ist.

Teilnehmer enthält dann z.B. nur "administrator" wenn dieser gerade angemeldet war.

Geht der User hin und ändert nun den  "Teilnehmer"-Feldinhalt, wird "ItemUpdated()" aufgerufen.

- Teilnehmer enhält NACH ItemUpdated() nun z.B. "administrator, user1"
- teilnehmer_before wird mit

[...]
properties.ListItem["teilnehmer_before"] = ((SPFieldUserValueCollection)properties.ListItem["Teilnehmer"]);

properties.ListItem.Update();

den alten Wert "administrator" zugewiesen.

So kann ich nun auch mit dem alten Zustand von "teilnehmer_before" arbeiten und alles passiert in einer einzigen Handler-Funktion, nämlich "ItemUpdated()".

Danke für die Probleme, die ich euch machen konnte  :-)