Копировать элементы списка из одного списка в другой в sharepoint
Автор вопроса: raklosОтветов: 11
Как в Sharepoint можно скопировать элемент списка из одного списка в другой, например, скопировать из "Списка А" в "Список Б" (оба находятся в корне сайта)
Я хочу, чтобы это копирование происходило, когда новый элемент списка добавляется в "Список А"
Я попытался использовать метод CopyTo () объекта SPListItem внутри приемника событий ItemAdded, но не смог определить URL-адрес для копирования.
См. Также stackoverflow.com/questions/4508211/ SteveC 04.01.2011
На самом деле, как сказал Ларс, может быть сложно перемещать элементы, сохранять версии и исправлять информацию о пользователе. Я делал аналогичные вещи с этим раньше, поэтому, если вам нужны примеры кода, дайте мне знать через комментарий и могу предоставить вам некоторые рекомендации.
Метод CopyTo (если вы решите пойти с этим) нужен абсолютный Uri, например: http://host/site/web/list/filename.doc
Итак, если вы выполняете это в приемнике событий, вам необходимо объединить строку, содержащую необходимые элементы. Что-то вроде (обратите внимание, что это можно сделать и другими способами):
Вот код, который я использую. Передайте ему SPlistItem и имя целевого списка, как показано в Sharepoint (не URL-адрес). Единственное ограничение - оба списка должны находиться на одном сайте:
Копирование и перемещение файлов, элементов и папок в SharePoint может быть сложной задачей, если вы хотите сохранить все метаданные, временные метки, информацию об авторе и историю версий. Взгляните на CopyMove для SharePoint - у него также есть API веб-службы.
Ответ 4 · рейтинг 1 · Sebastien
На рынке есть много инструментов для копирования элемента списка в другой список (точка, метавис и т. Д.), Но они довольно дороги, если вы планируете делать это только с одним списком.
Если вы можете делать это вручную, например, раз в неделю, обратите внимание на следующий инструмент: http://en.share-gate.com/sharepoint-tools/copy-move-sharepoint-list-items-with-metadata-and-version-history
Ответ 5 · рейтинг 1 · Daniel
Вот эквивалент Sylvian в PowerShell, который позволяет копировать между сайтами. Его код тоже можно изменить ...
private void CopyAttachmentsToList(SPListItem srcItem, SPListItem tgtItem)
{
try
{
//get source item attachments from the folder
SPFolder srcAttachmentsFolder =
srcItem.Web.Folders["Lists"].SubFolders[srcItem.ParentList.Title].SubFolders["Attachments"].SubFolders[srcItem.ID.ToString()];
//Add items to the target item
foreach (SPFile file in srcAttachmentsFolder.Files)
{
byte[] binFile = file.OpenBinary();
tgtItem.Update();
tgtItem.Attachments.AddNow(file.Name, binFile);
tgtItem.Update();
}
}
catch
{
//exception message goes here
}
finally
{
srcItem.Web.Dispose();
}
}
Не забудьте добавить эту строку tgtItem.Update();, иначе вы получите ошибку.
Ответ 8 · UnhipGlint
Значит, в списках одинаковые или похожие столбцы? В любом случае вы можете создать простой рабочий процесс, который запускается автоматически при создании элемента в "Списке А". Поскольку рассматриваемый рабочий процесс относительно прост, я бы рекомендовал использовать SharePoint Designer (который является бесплатным) для его создания, поскольку вы можете легко сопоставить столбцы из двух списков. Приведенное ниже описание должно помочь вам начать работу.
public static SPListItem CopyItem(SPListItem sourceItem, SPList destinationList)
{
SPListItem targetItem = destinationList.AddItem();
//loop over the soureitem, restore it
for (int i = sourceItem.Versions.Count - 1; i >= 0; i--)
{
//set the values into the archive
foreach (SPField sourceField in sourceItem.Fields)
{
SPListItemVersion version = sourceItem.Versions[i];
if ((!sourceField.ReadOnlyField) && (sourceField.InternalName != "Attachments"))
{
SetFields(targetItem, sourceField, version);
}
}
//update the archive item and
//loop over the the next version
targetItem.Update();
}
foreach (string fileName in sourceItem.Attachments)
{
SPFile file = sourceItem.ParentList.ParentWeb.GetFile(sourceItem.Attachments.UrlPrefix + fileName);
targetItem.Attachments.Add(fileName, file.OpenBinary());
}
targetItem.SystemUpdate();
return targetItem;
}
private static bool SetFields(SPListItem targetItem, SPField sourceField, SPListItemVersion version)
{
try
{
targetItem[sourceField.InternalName] = version.ListItem[sourceField.InternalName];
return true;
}
catch (System.ArgumentException)//field not filled
{
return false;
}
catch (SPException)//field not filled
{
return false;
}
}
Ответ 11 · Anil Rathod
Копирование элементов списка из одного списка или библиотеки SharePoint в другой список или библиотеку SharePoint с помощью кода на стороне сервера C #
// Itecollection - это набор данных из исходного списка
public void CopyItemsFromOneListToAnotherList(SPListItemCollection itemCollection)
{
using (SPSite site = new SPSite(siteUrl))
{
using (SPWeb web = site.OpenWeb())
{
//Get destination list/library
//destListName - Destination list/library name
SPList destList = web.Lists.TryGetList(destListName);
foreach (SPListItem sourceItem in itemCollection)
{
//Add new Item to list
SPListItem destItem = destList.Items.Add();
foreach (SPField field in sourceItem.Fields)
{
if (!field.ReadOnlyField && !field.Hidden && field.InternalName != "Attachments")
{
if (destItem.Fields.ContainsField(field.InternalName))
{
//Copy item to destination library
destItem[field.InternalName] = sourceItem[field.InternalName];
}
}
}
//Update item in destination library or list
destItem.Update();
Console.WriteLine("Copied " + sourceItem["ID"] + "to destination list/library");
}
}
}
}