How to copy list item from one Sharepoint list to another with permission and attachment
Below code helps in copying listitems from one sharepoint list to another along with attachments and permissions
/// <summary>
/// Function copies list item from source list to destination list in folder named '2015'
/// </summary>
/// <param name="web"></param>
/// <param name="sourceListName"></param>
/// <param name="destListName"></param>
/// <returns></returns>
private int CopyItems(SPWeb web, string sourceListName, string destListName)
{
//Get Source List
SPList sourceList = web.Lists[sourceListName];
//Get Destination List
SPList destList = web.Lists[destListName];
//Initiate variables
SPListItem folderListItem = null;
web.AllowUnsafeUpdates = true;
bool IsFolderExist = false;
int itemCount=0;
try
{
//Check if list already contains folder name '2015'
foreach (SPListItem item in destList.Folders
{
if (item.Title == "2015")
{
//set the folder name
folderListItem = item;
IsFolderExist = true;
}
}
//If folder dows not exist
if (!IsFolderExist)
{
/* Path within the list where the new folder gets created Leave it empty if it needs to be created under root */
String nodeDepthPath = @"";
/* create a folder under the path specified */
SPListItem folderItem = destList.Items.Add(destList.RootFolder.ServerRelativeUrl + nodeDepthPath, SPFileSystemObjectType.Folder);
/* set the folder name and update */
folderItem["Title"] = ddlYear.SelectedValue;
folderItem.Update();
folderListItem = folderItem;
}
//Get Desired list items
SPQuery myQuery = new SPQuery();
/*Form Query if required*/
//Get lists item to copy
SPListItemCollection sourceListItems = sourceList.GetItems(myQuery);
foreach (SPListItem item in sourceListItems)
{
//Call Copy list items to copy data
CopyItem(item, destList, folderListItem);
itemCount++;
}
}
catch (Exception ex)
{
lblErrorMessage.Text = ex.Message;
lblErrorMessage.ForeColor = Color.Red;
}
return itemCount;
}
/// <summary>
/// Function Copies data
/// </summary>
/// <param name="item"></param>
/// <param name="destList"></param>
/// <param name="DestinationfolderItem"></param>
private void CopyItem(SPListItem item, SPList destList, SPListItem DestinationfolderItem)
{
//Create new list item in destination folder
SPListItem newItem = destList.Items.Add(DestinationfolderItem.Folder.ServerRelativeUrl, SPFileSystemObjectType.File);
//Set variable for copying attachments
bool IsItemsAttached = false;
try
{
//Iterate through all fields of source list item
for (int i = 0; i < item.Fields.Count - 1; i++)
{
//Copy field to new item if they are not read only fields
if ((!newItem.Fields[i].ReadOnlyField) && (newItem.Fields[i].InternalName != "Attachments"))
{
newItem[newItem.Fields[i].InternalName] = item[newItem.Fields[i].InternalName];
}
//Copy attachments
else if (newItem.Fields[i].InternalName != "Attachments" && !IsItemsAttached)
{
if (newItem.Fields[i].InternalName == "Created")
{
newItem["Created_x0020_Date0"] = item[newItem.Fields[i].InternalName];
}
foreach (string filename in item.Attachments)
{
var file = item.ParentList.ParentWeb.GetFile(item.Attachments.UrlPrefix + filename);
var imageData = file.OpenBinary();
newItem.Attachments.Add(filename, imageData);
IsItemsAttached = true;
}
}
}
newItem.Update();
//Call Function to copy permission
CopyPermission(item, newItem); }
catch (Exception ex)
{
lblErrorMessage.Text = ex.Message;
lblErrorMessage.ForeColor = Color.Red;
}
}
/// <summary>
/// Function Copies permission
/// </summary>
/// <param name="destList"></param>
/// <param name="DestinationfolderItem"></param>
private void CopyPermission(SPListItem sourceItem, SPListItem destItem)
{
//Get role assignment of source list item
foreach (SPRoleAssignment roleAssign in sourceItem.RoleAssignments)
{
SPSecurity.RunWithElevatedPrivileges(delegate
{
if (destItem != null)
{
//Assign role in destination list item
destItem.BreakRoleInheritance(false); destItem.RoleAssignments.Add(roleAssign);
}
});
}
}