请帮忙。
我在一个网站中有两个不同的列表。
在一个列表中,我在新表单中附加了一个查询字符串,表示用户的EMP_ID。在这里,我有一个隐藏字段“Name”来表示用户填写的记录。此“名称”字段是从具有EMP_ID值的其他表引用的。
以下是我的代码:
try
{
SPSite ohportal = new SPSite("http://moss2007dev:1234");
SPWeb site = ohportal.OpenWeb();
SPList vitality = site.Lists[properties.ListId];
SPList employees = site.Lists["Employees List"];
SPListItemCollection vitalityCollection = vitality.Items;
SPListItemCollection employeesCollection = employees.Items;
SPListItem currentItem = properties.ListItem;
string empId = HttpContext.Current.Request.QueryString["EMP_ID"].ToString();
foreach(SPListItem item in employeesCollection)
{
if(item["EMP_ID"].Equals(empId)){
string name = item["Name"].ToString();
currentItem["Name"] = name;
}
}
}
catch (Exception err)
{
properties.ErrorMessage = "ERROR: " + err.Message;
}
答案 0 :(得分:3)
首先,我认为您无法从事件接收器中访问页面的查询字符串参数。作为一种解决方法,我建议使用JavaScript在SPListItem中填充EMP_ID字段。
其次,“Created By”系统字段不会保留创建记录的用户吗?
例如,将此JavaScript放在EditForm.aspx上以从EMP_ID参数填充名为“Emp ID Field”的字段:
<script type="text/javascript" src="/path/to/prototype.js"></script>
<script type="text/javascript" src="/path/to/SPUtility.js"></script>
<script type="text/javascript">
function SetValueFromURL(fieldName,queryParamName) {
var queryParams = location.href.toQueryParams();
if (queryParams != null && queryParams[queryParamName] != null) {
SPUtility.GetSPField(fieldName).SetValue(decodeURI(queryParams[queryParamName]));
}
}
Event.observe(window,'load',function(){
try {
// TODO: Put your code here
SetValueFromURL('Emp ID Field', 'EMP_ID');
} catch (ex) {
alert(ex.toString());
}
});
</script>
这是使用SPUtility.js(完全披露,此库由我维护)。
然后,在您的事件接收器中,您可以访问EMP ID以查找正确的名称。
try
{
// same code...
SPListItem currentItem = properties.ListItem;
// **CHANGED** get the current employee's ID from the current SPListItem
string empId = currentItem["Emp ID Field"].ToString();
foreach(SPListItem item in employeesCollection)
{
if(item["EMP_ID"].Equals(empId)){
string name = item["Name"].ToString();
currentItem["Name"] = name;
}
}
}
catch (Exception err)
{
properties.ErrorMessage = "ERROR: " + err.Message;
}
我注意到你的代码还有其他一些事情......
properties.ListItem
时可能会遇到问题。我认为您可能需要更新AfterProperties
而不是take a look at this very handy reference)。例如:
try
{
SPSite ohportal = new SPSite("http://moss2007dev:1234");
SPWeb site = ohportal.OpenWeb();
SPList vitality = site.Lists[properties.ListId];
SPList employees = site.Lists["Employees List"];
SPListItemCollection vitalityCollection = vitality.Items;
SPListItemCollection employeesCollection = employees.Items;
SPListItem currentItem = properties.ListItem;
// lookup the employees name
string empId = currentItem["EMP_ID"].ToString();
SPListItem employee = list.GetItemById(Int32.Parse(empId));
properties.AfterProperties["Name"] = employee["Name"].ToString();
}
catch (Exception err)
{
properties.ErrorMessage = "ERROR: " + err.Message;
}
答案 1 :(得分:0)
我认为这是不可能的,但你应该尝试同步的ItemAdding事件