2016-01-13 1 views
-1

У меня есть два сайта с тем же именем и теми же столбцами. Теперь я хочу создать обновленный приемник событий, в котором, когда пользователь обновляет любой элемент списка в списке 1, он должен быть обновлен в списке 2. Пользователь может создать новый элемент в обоих списках.Как синхронизировать два списка в двух разных SPSites с помощью приемников событий?

using (SPSite site = new SPSite("url")) 
       using (SPWeb webWList = site.OpenWeb()) 
       { 
        SPList targetList = web.Lists["listTitle"]; 
        string ID = properties.ListItem[""].ToString(); 
        string internalColNAme = properties.ListItem.Fields["ColNAme"].InternalName.ToString(); 


        SPQuery query = new SPQuery(); 
        query.Query = "<Query><Where><Eq><FieldRef Name=''/><Value Type='Number'>" + properties.ListItemId + "</Value></Eq></Where></Query>"; 

        SPListItemCollection items = targetList.GetItems(query); 

        SPListItem item = items[0]; 

        item["ColName"] = properties.ListItem[""]; 
        item.Update();   
       } 
      }); 

Приемник событий работает нормально, но его обновление неправильного элемента.

ответ

0

Возможно, вы хотите посмотреть на this tutorial.

В событии ItemAdded получите список из другого SPSite и добавьте его туда, используя метод SPList.AddItem(). Чтобы обеспечить достаточные права доступа, запустите его с повышенными привилегиями.

Некоторые примеры кода для в ItemAdded Метод

SPSecurity.RunWithElevatedPrivileges(delegate() 
{ 
    using(SPSite siteWhereNewItemWillBeAdded = new SPSite("url of web with list 2")) 
    using(SPWeb webWithList = siteWhereNewItemWillBeAdded.OpenWeb()) 
    { 
     SPList targetList = webWithList.Lists["listTitle"]; 
     SPListItem newItem = targetList.AddItem(); 
     //Set properties of item 
     newItem["column of list 2"] = properties.ListItem["column of list 1"] 
     newItem.Update(); 
    } 
}); 

Заменить строки с описанным содержание и добавить больше строки набора свойств, если у вас есть несколько столбцов/поля для копирования в элемент из списка 2.

Требование об обновлении - это другая история, которую вам нужно сохранить, чтобы элемент в списке 1 принадлежал к тому элементу в списке 2. В противном случае вы не сможете сказать, какой элемент обновляется, если у вас нет уникального и равного поля в обеих таблицах.

Чтобы добиться того, что вы можете добавить собственный столбец в список2. Допустим, что пользовательский столбец называется «list1Item».

В ItemUpdated события вы бы тогда:

SPSecurity.RunWithElevatedPrivileges(delegate() 
{ 
    using(SPSite siteWhereNewItemWillBeAdded = new SPSite("url of web with list 2")) 
    using(SPWeb webWithList = siteWhereNewItemWillBeAdded.OpenWeb()) 
    { 
     SPList targetList = webWithList.Lists["listTitle"]; 
     var list2Items = targetList.Items; 
     var syncedItem = from SPListItem item in list2Items 
         where Convert.ToString(item["list1Item"]).Equals(properties.ListItem.ID.ToString()) 
         select item; 
     //Set properties of item 
     syncedItem["column of list 2"] = properties.ListItem["column of list 1"] 
     syncedItem.Update(); 
    } 
}); 

Чтобы отобразить элементы добавить эту строку в ItemAdded событие, где вы установите значения столбцов.

newItem["list1Item"] = properties.ListItem.ID; 

UPDATE: Для того, чтобы соответствовать обновление вопроса

Это полный код в контексте SPSecurity этого пункта Обновлено события? Для чего вы используете эти переменные?

string ID = properties.ListItem["Zone"].ToString(); 
string internalColNAme = properties.ListItem.Fields["ColNAme"].InternalName.ToString(); 

Из моего понимания вы пытаетесь написать содержание элемента в list1 в колонке «Зона» на элемент list2 колонке «ColName». Элементы сопоставляются с помощью столбца «Отображение» в списке2. Поддерживает ли ваш ItemAdded Method любую версию следующей строки?

newItem["Mapping"] = properties.ListItemId; 

Вы сказали, что его обновление неправильного элемента. У вас есть более одного элемента с тем же содержимым «Сопоставление» в списке2? Ваш код обновит только первый найденный по запросу.

+0

Еогеасп (SPField поле в properties.ListItem.Fields) { , если { newItem [field.InternalName] = properties.ListItem [field.InternalName] (field.ReadOnlyField!); } } новый элемент продуктаОбновить(); webWithList.AllowUnsafeUpdates = false; } }) ;. – zombiee

+0

привет @noobischernoob, пожалуйста, проверьте код в обновленном вопросе – zombiee

+0

Ответ обновлен. Вы отлаживали код, чтобы узнать, возвращает ли SPQuery только 1 элемент? – noobischernoob

0
using (SPSite site = new SPSite("url")) 
       using (SPWeb webWithList = site.OpenWeb()) 
       { 
        SPList targetList1 = webWithList.Lists["listTitle"]; 
        string ID = properties.ListItem["Zone"].ToString(); 
        string internalColNAme = properties.ListItem.Fields["ColNAme"].InternalName.ToString(); 


        SPQuery query = new SPQuery(); 
        query.Query = "<Where><Eq><FieldRef Name='Mapping'/><Value Type='Number'>" + properties.ListItemId + "</Value></Eq></Where></Query>"; 

        SPListItemCollection items = targetList1.GetItems(query); 

        SPListItem item = items[0]; 

        item["ColName"] = properties.ListItem["Zone"]; 
        item.Update();   
       } 
      }); 

 Смежные вопросы

  • Нет связанных вопросов^_^