[SharePoint 2010] Copy list item with version history and attachment
1 private void MoveItem(SPListItem sourceItem, SPListItem destinationItem) 2 { 3 if (sourceItem == null || destinationItem == null) return; 4 5 destinationItem = GetDestinationItem(sourceItem.ID, destinationItem); 6 7 SPFieldLookup lkpField = null; 8 SPFieldLookupValue lkpFieldVal=null; 9 object fieldVal = null; 10 SPUser systemAccount = destinationItem.Web.AllUsers["SHAREPOINT/system"]; 11 SPWeb sourceWeb = sourceItem.Web; 12 SPWeb destWeb = destinationItem.Web; 13 14 Log("-----Begin of handle item-----"); 15 16 Log(string.Format("----------Source item [{0}/{1}]----------", sourceItem.Title, sourceItem.ID)); 17 18 #region Handle version history 19 20 for (var i = sourceItem.Versions.Count - 1; i >= 0; i--) 21 { 22 foreach (SPField sourceField in sourceItem.Fields) 23 { 24 SPListItemVersion version = sourceItem.Versions[i]; 25 fieldVal = version[sourceField.InternalName]; 26 27 Log(string.Format("----------Handle field[{0}/{1}]----------", sourceField.InternalName, sourceField.Type.ToString())); 28 29 if (sourceField.Type == SPFieldType.User) 30 { 31 fieldVal = GetSPUserFromString(new SPFieldUserValue(sourceWeb, fieldVal.ToString()), destWeb); 32 Log(string.Format("----------user field[{0}/{1}]----------", sourceField.InternalName, fieldVal)); 33 } 34 35 if (sourceField.Id == SPBuiltInFieldId.Created || 36 sourceField.Id == SPBuiltInFieldId.Created_x0020_By || 37 sourceField.Id == SPBuiltInFieldId.Modified || 38 sourceField.Id == SPBuiltInFieldId.Modified_x0020_By || 39 sourceField.Id == SPBuiltInFieldId.Author || 40 sourceField.Id == SPBuiltInFieldId.Editor) 41 { 42 destinationItem[sourceField.InternalName] = fieldVal; 43 } 44 else if (!sourceField.ReadOnlyField && sourceField.Type != SPFieldType.Attachments) 45 { 46 if (sourceField.Type != SPFieldType.Lookup) 47 { 48 destinationItem[sourceField.InternalName] = fieldVal; 49 } 50 else 51 { 52 lkpField = sourceField as SPFieldLookup; 53 54 Log(string.Format("----------source field value[{0}]----------", fieldVal)); 55 56 if (lkpField != null && fieldVal != null && fieldVal.ToString().Length > 0) 57 { 58 lkpFieldVal = new SPFieldLookupValue(fieldVal.ToString()); 59 destinationItem[sourceField.InternalName] = lkpFieldVal; 60 } 61 } 62 } 63 } 64 65 //update destination item 66 destinationItem.Update(); 67 68 Log("----------End of handle field----------"); 69 }
1 private SPListItem GetDestinationItem(int sourceItemID, SPListItem destinationItem) 2 { 3 SPList list = DestinationList; 4 5 if (sourceItemID - CurrentItemID > 1) 6 { 7 for (int i = CurrentItemID + 1; i < sourceItemID; i++) 8 { 9 SPListItem item = list.Items.Add(); 10 item[SPBuiltInFieldId.Title] = "-1"; 11 12 item.Update(); 13 } 14 return list.Items.Add(); 15 } 16 else 17 { 18 return destinationItem; 19 } 20 }
1 private SPUser GetSPUserFromString(SPFieldUserValue userVal, SPWeb web) 2 { 3 try 4 { 5 if (userVal != null) 6 return web.EnsureUser(userVal.User.LoginName); 7 else 8 return null; 9 } 10 catch 11 { 12 return null; 13 } 14 }
本文版权归菜鸟和博客园共有,欢迎转载,但请注明出处。