Sharepoint Listenelement (SPListItem) in eine andere Liste kopieren
Dafür gibt es (theoretisch) eine denkbar einfache Lösung: SPListItem bietet eine Methode CopyTo(destinationUrl) an (http://msdn2.microsoft.com/en-us/library/microsoft.sharepoint.splistitem.copyto.aspx) - leider scheint diese aber nicht (in jedem Fall?) zu funktionieren. Zumindest in meinem Fall (benutzerdefinierte Liste mit benutzerdefiniertem Inhaltstyp UND Attachments - vielleicht erwarte ich einfach auch zu viel von Sharepoint…) tat sie es nicht. Stattdessen erhielt ich folgende Exception: "Source item cannot be found. Verify that the item exist and that you have permission to read it." Eine rasche Recherche bei Google brachte mir die Erkenntnis, dass andere Leute das gleiche Problem auch schon hatten - leider ohne verwertbare Lösungsvorschläge…
Also erstellen wir uns eben selbst eine kleine statische Methode, die das gewünschte tut:
Die Methodensignatur erwartet ein Quellelement und einen Listenname und gibt das kopierte Zielelement zurück:
Zuerst erstellen wir das Zielelement in der angegebenen Liste. Dann gehen wir Schritt für Schritt alle Fields des Quellelementes durch und kopieren diese zum Zielelement:
Achtung! Wir sollten nicht versuchen, readonly Fields zu kopieren und auch die Attachments lassen sich nicht auf diese Weise "abfertigen". Diese behandeln wir folgendermaßen:
Nun noch schnell das Zielelement gespeichert und zurückgegeben - fertig!
So könnte z.B. der Aufruf der Methode aussehen:
Zum besseren Kopieren hier das Ganze nochmal als Text:
public static SPListItem CopyItem(SPListItem sourceItem, string destinationListName)
{
//copy sourceItem to destinationList
SPList destinationList = sourceItem.Web.Lists[destinationListName];
SPListItem targetItem = destinationList.Items.Add();
foreach (SPField f in sourceItem.Fields)
{
if (!f.ReadOnlyField && f.InternalName != "Attachments")
{
targetItem[f.InternalName] = sourceItem[f.InternalName];
}
}
//copy attachments
foreach (string fileName in sourceItem.Attachments)
{
SPFile file = sourceItem.ParentList.ParentWeb.GetFile(sourceItem.Attachments.UrlPrefix + fileName);
byte[] imageData = file.OpenBinary();
targetItem.Attachments.Add(fileName, imageData);
}
targetItem.Update();
return targetItem;
}
Sie haben Fragen oder möchten sich von uns beraten lassen?
Gerne steht unsere Expertin für Ihre Fragen zur Verfügung.
Nutzen Sie unser Kontaktformular.
Ihre Ansprechpartnerin
Sabine KleinCustomer Success Managerin
- Ungargasse 37, 1030 Wien
- Tel.: +43 139 505 045
- anfrage@communardo.de