Как скопировать SPListitem из одного SPList в другой 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();
}

person Azra    schedule 17.07.2009    source источник
comment
Проверьте: stackoverflow.com/questions/1059175   -  person Johan Leino    schedule 17.07.2009


Ответы (4)


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

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

person Rob Windsor    schedule 17.07.2009
comment
но на том же сайте, который я читал, метод CopyTo работает только для файла SPListitems, а не для объекта. - person Azra; 17.07.2009
comment
Это также относится к элементу списка: msdn.microsoft .com / ru-ru / library / - person Alex Angas; 17.07.2009
comment
Это не сработает, если это настраиваемый список. blogs.msdn.com/b/bgeorgi/archive/2008/03/06/ - person Robert Kaucher; 21.07.2015

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

// ** 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();
person Jeroen Ritmeijer    schedule 28.01.2010

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

person jaloplo    schedule 07.01.2010

  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!
        } 
       } 
      } 
person naivists    schedule 07.01.2010
comment
Возможно ли это с помощью сценария ECMA. В настоящее время в моей среде у меня не установлен VS 2010, и я не могу полностью контролировать dev.server. - person userAZLogicApps; 16.11.2015