Я считаю, что SPListItem.Copy и SPListItem.CopyTo будут работать только в том случае, если целевой список находится на том же SPWeb, что и исходный элемент. Я предполагаю, что эти элементы списка имеют некоторое поле «идентичность», которое не только отличает его от других элементов списка, но также всегда одинаково для всех дочерних сайтов и сайта верхнего уровня (в отличие от идентификатора, который не равен 100). % под вашим контролем). Может быть заголовком, может быть программно назначенным номером, может быть чем угодно. Я просто назову это поле "личность".
Я предполагаю, что вы знаете обработчики событий. Если вы этого не сделаете, вы можете увидеть очень простой пример здесь , который объясняет все основные понятия.
Удаление - это самая легкая вещь для обработки. Просто выполните итерацию по дочерним сайтам, выполните итерацию по основному списку для элемента с правильным полем «identity» и вызовите SPListItem.Delete () для него. Этого должно быть достаточно для помещения события ItemDeleting.
Добавление немного сложнее. Еще раз переберите дочерние сайты, но на этот раз используйте метод, подобный следующему.
SPListItem target = list.Items.Add();
target["Title"] = properties.AfterProperties["Title"];
//Repeat similar assignments for all fields in the list item which can be assigned during creation.
target.Update();
Это нужно будет изменить, чтобы включить каждое поле, которое можно изменить, а также поле «идентификатор», если вы его еще не включили. Вам не нужно беспокоиться о том, что будет назначено автоматически (SharePoint все равно будет их обрабатывать, если сработает Copy / CopyTo). Поместите его в событие ItemAdded.
Наконец, обновление элемента очень похоже на добавление элемента, только вместо вызова list.Items.Add (), вместо этого вы получаете правильный элемент, перебирая основной список и получая элемент с правильной «идентичностью» поле. Поместите его в событие ItemUpdated.
Возможно, вы захотите убедиться, что разрешения для дочерних сайтов в основном списке такие же, как и на сайте верхнего уровня. Надеюсь, что это работает для вас!