Techblog

Herzlich Willkommen im Communardo Techblog, dem Entwickler-Weblog von Communardo. An dieser Stelle werden Ideen, Problemlösungen, Tipps und Problemstellungen rund um die Entwicklung webbasierter Software vorgestellt.

techblog-teaser

Sharepoint Listenelement (SPListItem) in eine andere Liste kopieren

, von
18 Kommentare

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:

image

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:

image

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:

image

Nun noch schnell das Zielelement gespeichert und zurückgegeben – fertig 🙂

image

So könnte z.B. der Aufruf der Methode aussehen:

image

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;
}

Artikel als PDF speichern
18 Antworten zu:
“Sharepoint Listenelement (SPListItem) in eine andere Liste kopieren”
  1. SP_Bert
    23. Juli 2014, 12:21 Uhr

    Danke!!!

  2. Dorrit Riemenschneider
    13. Dezember 2011, 10:31 Uhr

    For External Data columns it has to possible, too. I think you had to verify whether it concerns an External Data column and if so, then put some code there referencing the external content type.

  3. matt
    28. November 2011, 12:29 Uhr

    Hello. That is a nce solution, however I can’t get it working with External Data column (that contains a reference to external content type). The text comun content is being copied, the external data column stays empty. Do you know if it is possible at all? Cheers.

  4. Dorrit Riemenschneider
    1. November 2011, 13:29 Uhr

    Hello Yoshi, as funny as it sounds: I think you must have done something wrong.

  5. Yoshi
    1. November 2011, 03:07 Uhr

    Hi Dorrit

    Thank you for sharing the code above. I have managed to get this to work with 2 identical custom lists in the same site. However, when I add a new list item to List A, it will create approximately 10 identical items in List B. Any clues on how to solve this?

    Thank you.

    Yoshi

  6. Dorrit Riemenschneider
    28. Oktober 2011, 11:08 Uhr

    Hello Yoshi, same problem regarding code line „SPList destinationList = sourceItem.Web.Lists[destinationListName];“. Of course you can adapt it in order to bring it to work between different sites.

  7. Yoshi
    28. Oktober 2011, 09:30 Uhr

    Hello

    Will it work for two lists in two subsites of the same site collection?

    Example:

    Subsite A – List 1

    To

    Subsite B – List 2

    Thank you

    Yoshi

  8. Dorrit Riemenschneider
    28. Oktober 2011, 08:41 Uhr

    Hello Yoshi, the code is meant for copying items between two lists in the same site. The code line „SPList destinationList = sourceItem.Web.Lists[destinationListName];“ won’t work between site collections.

  9. Yoshi
    28. Oktober 2011, 07:46 Uhr

    Hello

    I am having trouble implementing the code above. I have two sitecollections and want to copy a list item from one site collection list to another site collection list.

    Sitecollection 1name: mySiteCollection1

    Sitecollection 2 name: mySiteCollection2

    This is my code which is run in Site Collection 1. I have created the event handler and have added it to the GAC and implemented the Feature.

    public override void ItemAdded(SPItemEventProperties properties) {
    SPListItem approvedItem = CopyItem(properties.ListItem, „http://localhost/mysitecollection2/mysubsite/Contacts/AllItems.aspx“);
    }

    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 != „Contacts“)
    {
    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;
    }

    Thank you

    Yoshi

  10. Aleksandr Sharmko
    25. Juli 2011, 17:31 Uhr

    BIG thanks!!!

  11. Syahri Ramadhan
    13. Dezember 2010, 12:33 Uhr

    OMG….you are a GENIUS ! Thank you so much for covering this problem, your solution save my day ! I really2 appreciate your effort for this ! 😀

  12. Tomek
    3. Dezember 2010, 14:19 Uhr

    thank you, it was very helpful for me.

  13. Johannes H
    14. Oktober 2010, 15:16 Uhr

    Hallo!

    Danke für den hilfreichen Post! Wollte nur noch anmerken, dass beim kopieren ein „Assigned To“ Field nicht mitkopiert wird, da (unter Umständen) der User in einer anderen Site Collection eine andere Userid haben kann 😉 )
    Ansonsten funktioniert das aber super!

    viele Grüße aus München
    Johannes

  14. Dorrit Riemenschneider
    17. Juni 2010, 09:54 Uhr

    Hi pankaj, you should be able to solve your problem by using the SPUserToken object. Here you can find a similiar (not just the same but I think you can adapt this) solution: http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopment/thread/41d34a5e-e53b-4d27-bc0a-4a4bb2107e6a
    Cheers, Dorrit

  15. pankaj
    10. Juni 2010, 13:37 Uhr

    Hi Dorrit,
    The solution works fine. But it does not copy the „Created By“ field i.e. when a listitem is copied to another list, the „created by“ is set to the system account and not the „created by“ column from the source list. I have a requirement where i want to replicate the „Created by“ field too.

  16. […] showed that I was not the only one struggling with this. Several solutions are available like: http://www.communardo.de/techblog/2008/01/08/sharepoint-listenelement-splistitem-in-eine-andere-list… (you can read the code… ) […]

  17. Tom
    14. April 2008, 16:58 Uhr

    Hallo Dorrit,

    vielen Dank für diesen SEHR hilfreichen Beitrag.
    Hat mir aktuell sehr geholfen 😉

    LG Tom

  18. AISMAN
    27. Januar 2008, 10:08 Uhr

    Hi Dorrit,
    möchte „Danke“ sagen.
    Das kann ich demnächst sehr gut gebrauchen 🙂
    Liebe Grüsse
    aus Köln
    Manfred

Schreiben Sie einen Kommentar

*

Diese Webseite basiert auf Wordpress. © 2014 Communardo Software GmbH / Kleiststraße 10 a / D-01129 Dresden / Fon +49 (0) 351/8 33 82-0 / info@communardo.de