How to copy SPListitem from one SPList to another SPList

I have a requirement to copy elements from one SPList to another,

Here is the code that does not work:

public void CopyList(SPList src) { //Copy items from source List to Destination List foreach (SPListItem item in src.Items) { if(isUnique(item.UniqueId)) { foreach (SPField field in src.Fields) { try { if (!field.ReadOnlyField) newDestItem = DestinationList.Items.Add(); newDestItem[field.Id] = item[field.Id]; newDestItem.Update(); } catch (Exception ex) { ex.ToString(); } } //newDestItem["wrkspace"] = src.ParentWeb.Name; // newDestItem.Update(); } DestinationList.Update(); } // DestinationList.Update(); } 
+1
source share
4 answers

The SPListItem type has a CopyTo method that will do what you want.

http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splistitem.copyto.aspx

+3
source

You forgot to copy attachments of elements. Look in this article , part of the code was repeated below.

 // ** Copy the fields foreach(SPField field in sourceItem.Fields) { if (newItem.Fields.ContainsField(field.InternalName) == true && field.ReadOnlyField == false && field.InternalName != "Attachments") { newItem[field.InternalName] = sourceItem[field.InternalName]; } } // ** Delete any existing attachments in the target item for (int i = newItem.Attachments.Count; i > 0; i-- ) { newItem.Attachments.Delete(newItem.Attachments[i-1]); } // ** Copy any attachments foreach (string fileName in sourceItem.Attachments) { SPFile file = sourceItem.ParentList.ParentWeb.GetFile(sourceItem.Attachments.UrlPrefix + fileName); byte[] imageData = file.OpenBinary(); newItem.Attachments.Add(fileName, imageData); } // ** Remember where the original was copied from so we can update it in the future newItem["_M_CopySource"] = sourceItem["FileRef"]; newItem.Update(); 
+3
source

Check out this post, link . This is the best approach I have found.

0
source
  • Do not call "update" on DestItem in each field. You need it only once!
  • field.id may vary on different listings. Use the InternalName property instead.
  • The exception you exclude is not saved anywhere!
  • You do not need to call DestionationList.Update , you do not change the settings of the mailing list or anything else.

I changed the code to show these changes.

 public void CopyList(SPList src) { //Copy items from source List to Destination List foreach (SPListItem item in src.Items) { if(isUnique(item.UniqueId)) { newDestItem = DestinationList.Items.Add(); foreach (SPField field in src.Fields) { try { if ((!field.ReadOnlyField) && (field.InternalName!="Attachments")) newDestItem[field.InternalName] = item[field.InternalName]; } catch (Exception ex) { //you should save the "ex" somewhere to see its outputs ex.ToString(); } } newDestItem.Update(); //only now you call update! } } } 
0
source

All Articles