2009-08-10 14 views
4

Ich habe einen Ereignisempfänger geschrieben, der beim Ereignis 'ItemAdded' einer Seitenliste aktiviert wird. Der Code läuft gut, aber mein Problem ist dies - während des Aufrufs zu meinem Sub ItemAdded möchte ich den Wert eines Felds ändern, das zu dem aktuellen Listenelement gehört (in diesem Fall eine aspx-Seite).Verwenden eines Ereignisempfängers, um das Feld 'Titel' eines Elements zu aktualisieren

Die Idee ist, dass ich das Feld "Titel" als einen anderen Wert konfigurieren kann, den mein Ereignisempfänger konfiguriert, und zu dem Zeitpunkt, zu dem der Benutzer die Seite im Bearbeitungsmodus sieht, wurde der neue Titel für die Seite gespeichert . Hier ist mein aktueller Versuch:

Public Overrides Sub ItemAdded(ByVal properties As Microsoft.SharePoint.SPItemEventProperties) 

Dim newItem As SPListItem = properties.ListItem 
Dim currentSiteTitle As String = properties.OpenWeb().Title 

UpdateItemTitle(newItem, currentSiteTitle) 
newItem.Update() 
'newItem.SystemUpdate() 

End Sub 

Wie Sie sehen können, habe ich versucht, beide Updates() und Systemupdate(), aber in jedem Fall, wenn der Benutzer auf der Seite zu überprüfen versucht, bekommen sie eine Nachricht dass die Seite extern geändert wurde. Beim Anzeigen der Seite hat sich der Titelfeldwert nicht geändert.

Ist das, was ich versuche, überhaupt möglich, oder gibt es einen besseren Weg?

Prost. Jas.

Antwort

2

ItemAdd ed Der Name sagt alles. Es ist ein asynchrones Ereignis, das auftritt, nachdem die Elemente hinzugefügt wurden, also ist das Problem mit Ihrer calse. Ich empfehle Ihnen, das ItemAdding-Ereignis anzuhängen, es sei denn, Sie haben einen Grund, dies nicht zu tun.

Siehe die Link für Details zu Asynchronous & Synchron

+4

Beachten Sie, dass das ListItem im ItemAdding-Ereignis nicht verfügbar ist. Verwenden Sie stattdessen die AfterProperties []. –

0

Der beste Weg, dies ist die ItemAdd zu erreichen verwenden ing Ereignis. Dadurch können Sie den Titelwert vor dem Speichern in der Datenbank ändern. Der Versuch, sie in ItemAdded zu ändern, ist möglich, verursacht aber die Kopfschmerzen, die Sie haben.

Haben Sie ItemAdding versucht?

+0

Alex und kusek, Entschuldigung für die Verzögerung beim Antworten, aber ich bin für ein anderes Projekt vorerst umgezogen. Ich möchte diese Frage später noch einmal stellen, da ich das ItemAdded-Event noch nicht müde habe. –

3

Durch das Ändern der properties.afterproperties wird der Speicherkonflikt behoben. Beachten Sie, dass es sich bei den Nacheigenschaften um eine Hashtabelle handelt. Sie können jedoch folgendermaßen darauf zugreifen:

properties.AfterProperties ["Title"] = "Mein neuer Titel";

+0

Ich war schon länger an einem anderen Projekt, also hatte ich noch keine Gelegenheit, deine Antwort zu überprüfen. Ich werde mich darum kümmern, denn ich möchte eine Antwort auf diese Frage geben, nur um die Dinge sauber zu halten. –

+0

Dies funktionierte ausgezeichnet für mich, wenn ItemUpdating ausgeführt wurde. Sollte als Antwort markiert sein. –

+2

Bei 'ItemAdded',' ItemUpdated' Ereignissen wird dies nicht funktionieren und wird 'InvalidOperationException' mit der folgenden Meldung auslösen:' Das Ereignis unterstützt keine Änderung von Eigenschaften' –

0

Jetzt, nachdem ich von dem oben genannten gelesen hatte, fand ich, dass ich bei der Arbeit mit einer Diskussionsgruppe die Felder in der ItemUpdating-Methode ändern konnte, wo ich den neuen Wert den Eigenschaften zuweisen konnte .AfterProperties-Hash, der dem Elementnamen entspricht, wie zuvor erwähnt.

Leider schien dies nicht automatisch ausgeführt zu werden, wenn eine neue Antwort zur Diskussion hinzugefügt wurde (vielleicht in anderen Listen-Szenarien), aber wenn ich Code in die ItemAdded-Methode einfügte (ItemAdding wurde auch nicht ausgelöst) ich fand, dass es wird laufen gelassen wurde, aber das konnte ich nicht das Produkt von dort ändern, so landete ich mit so etwas wie dies in itemAdded up:

public override void ItemAdded(SPItemEventProperties properties) 
    { 
     SPListItem item = properties.ListItem; 
     item.Update(); 
    } 

das Ergebnis davon ist, dass das Feld aktualisiert wird, aber nicht bevor es angezeigt wird, so dass, wenn der Benutzer auf die Ausgabeseite gerichtet ist, die Liste wie zuvor aussieht, aber wenn Sie die Ansicht ändern oder die Details für die Antwort betrachten, werden Sie finde, dass es sich tatsächlich so verändert hat, wie es sollte.

Das ist gut genug für mich, da ich die meisten meiner Antworten per E-Mail erwartet.