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;11 12 Log("-----Begin of handle item-----"); 13 14 Log(string.Format("----------Source item [{0}/{1}]----------", sourceItem.Title, sourceItem.ID)); 15 16 #region Handle version history 17 18 for (var i = sourceItem.Versions.Count - 1; i >= 0; i--) 19 { 20 foreach (SPField sourceField in sourceItem.Fields) 21 { 22 SPListItemVersion version = sourceItem.Versions[i]; 23 fieldVal = version[sourceField.InternalName]; 24 25 Log(string.Format("----------Handle field[{0}/{1}]----------", sourceField.InternalName, sourceField.Type.ToString())); 26 27 if (sourceField.Id == SPBuiltInFieldId.Created || 28 sourceField.Id == SPBuiltInFieldId.Created_x0020_By || 29 sourceField.Id == SPBuiltInFieldId.Modified || 30 sourceField.Id == SPBuiltInFieldId.Modified_x0020_By || 31 sourceField.Id == SPBuiltInFieldId.Author || 32 sourceField.Id == SPBuiltInFieldId.Editor) 33 { 34 destinationItem[sourceField.InternalName] = fieldVal; 35 } 36 else if (!sourceField.ReadOnlyField && sourceField.Type != SPFieldType.Attachments) 37 { 38 if (sourceField.Type != SPFieldType.Lookup) 39 { 40 destinationItem[sourceField.InternalName] = fieldVal; 41 } 42 else 43 { 44 lkpField = sourceField as SPFieldLookup; 45 46 Log(string.Format("----------source field value[{0}]----------", fieldVal)); 47 48 if (lkpField != null && fieldVal != null && fieldVal.ToString().Length > 0) 49 { 50 lkpFieldVal = new SPFieldLookupValue(fieldVal.ToString()); 51 destinationItem[sourceField.InternalName] = lkpFieldVal; 52 } 53 } 54 } 55 } 56 57 //update destination item 58 destinationItem.Update(); 59 60 Log("----------End of handle field----------"); 61 } 62 63 #endregion 64 65 #region Handle attachement 66 67 foreach (string attachmentName in sourceItem.Attachments) 68 { 69 SPFile file = sourceItem.ParentList.ParentWeb.GetFile(sourceItem.Attachments.UrlPrefix + attachmentName); 70 71 Log(string.Format("----------Add attachment [{0}]----------", attachmentName)); 72 73 destinationItem.Attachments.Add(attachmentName, file.OpenBinary()); 74 } 75 76 destinationItem.SystemUpdate(false); 77 78 CurrentItemID = destinationItem.ID; 79 80 #endregion 81 82 Log("-----End of handle item-----"); 83 }
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 }
[SharePoint 2010] Copy list item with version history and attachment
原文:http://www.cnblogs.com/s1nce/p/CopyListItemWithVersionAndAttachment.html