我有两个具有相同列表名称和相同列的站点。现在我想创建项目更新事件接收器,其中当用户更新列表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();
}
});
事件接收器工作正常,但更新了错误的项目。
答案 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)