I have requirement to copy items from one SPList to another,
Here is the code which is not working:
public void CopyList(SPList src)
{
//Copy items f
Look at this post, link. This is the best approach I found.
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
You forgot to copy the item's attachments. Have a look at this article, part of the code has been 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();
field.id may be different in different lists. Use the InternalName property instead.DestionationList.Update, you are not changing the destination list's settings or anything.I modified 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!
}
}
}