如何使用事件接收器同步两个不同SPSites中的两个列表?

时间:2016-01-13 06:43:57

标签: sharepoint sharepoint-2010

我有两个具有相同列表名称和相同列的站点。现在我想创建项目更新事件接收器,其中当用户更新列表1中的任何列表项时,它应该在列表2中更新。用户可以在两个列表中创建新项目。

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

事件接收器工作正常,但更新了错误的项目。

2 个答案:

答案 0 :(得分: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中的哪个项目。否则您将无法告知要更新的项目,除非您有一些独特且相同的字段两张桌子。

要实现可以向list2添加自定义列。假设自定义列名为&#34; list1Item&#34;。

在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;

更新:匹配问题更新

这是项目更新事件的SPSecurity上下文中的完整代码吗? 你在为这些变量使用什么?

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

根据我目前的理解,您正在尝试在列#1;区域&#34;列中的list1中编写项目的内容。到list2列中的项目&#34; ColName&#34;。使用&#34; Mapping&#34;匹配项目。 list2中的列。您的ItemAdded方法是否包含以下行的任何版本?

newItem["Mapping"] = properties.ListItemId;

你说它更新了错误的项目。你有超过1项相同的&#34; Mapping&#34; list2中的内容?您的代码只会更新查询找到的第一个代码。

答案 1 :(得分:0)

#define Cpy(ToVar, FrmVar) do   {                                                                                 \
                            errno = strncpy_s(ToVar, sizeof(ToVar), FrmVar, _TRUNCATE);                     \
                                if (errno == STRUNCATE)                                                     \
                                    fprintf(stderr, "string '%s' was truncated to '%s'\n", FrmVar, ToVar);  \
                        } while(0)