2009-07-17 2 views
1

У меня есть требование, чтобы скопировать элементы из одного SPList к другому,Как скопировать SPListItem из одного SPList к другому SPList

Вот код, который не работает:

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(); 
} 
+0

Отъезд: http://stackoverflow.com/questions/1059175 –

ответ

3

Тип SPListItem имеет CopyTo, который будет делать то, что вы хотите.

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

+0

, но на том же сайте я прочитал, метод CopyTo работает только для SPListitems файла не объект. – Azra

+0

Он также относится к элементу списка: http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splistitem.copyto.aspx –

+0

Это не будет работать, если это настраиваемый список. http://blogs.msdn.com/b/bgeorgi/archive/2008/03/06/the-splistitem-copyto-method-doesn-t-seem-to-work-on-a-custom-list.aspx –

0

Посмотрите на этот пост, link. Это лучший подход, который я нашел.

0
  1. Не называть «обновление» на DestItem на каждое поле. Вам нужно только это один раз!
  2. field.id могут отличаться в разных списках. Вместо этого используйте свойство InternalName.
  3. Исключение, которое вы поймаете, нигде не сохраняется!
  4. Вам не нужно звонить DestionationList.Update, вы не меняете настройки списка адресатов или что-то еще.

Я изменил код, чтобы показать эти изменения

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

Возможно ли это с помощью сценария ECMA. В настоящее время, в моей среде, у меня нет установленного VS 2010 и нет полного контроля на dev.server – SaMolPP

3

Вы забыли скопировать вложение элемента. Посмотрите на this article, часть кода была повторена ниже.

// ** 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(); 
Смежные вопросы