我无法从列表中访问计算字段的值,该列表位于SharePoint代码隐藏中另一个列表的查找字段中。
页面上的ListFieldIterator向用户显示一组选项。我需要对用户做出的一些特定选择进行一些后端验证。
我有一个名为“事件类型”的列表,用户可以从中选择播放,性能,显示等。此列表有4列 - 描述,启用,默认和过滤。 Filtered是一个计算列,根据在其他列上选择的选项生成。
列表事件有一列,它是对此列表的查找,并显示已过滤的列。
现在在页面上这一切都很棒。选项显示给用户,他们可以进行选择。在添加计算字段之前,我可以通过执行以下操作来访问
SPFieldLookup eventTypeField = ListFieldIterator.Item.Fields.GetField("Event_x0020_Type") as SPFieldLookup;
if (eventTypeField.GetFieldValueAsText(ListFieldIterator.Item["Event_x0020_Type"]) == "Performance")
{
// some other logic
errorMessages.Add("There is an error here");
}
现在,当以这种方式访问字段时,我只得到一个空字符串。
如果我尝试使用
访问所选项目string value = eventFields.Item["Event_x0020_Type_x0020_1"].ToString();
然后我回到“8”,这是我选择的项目列表中的位置。 (它会根据我选择的列表中的项目而改变)
这篇文章Get value of calculate field似乎有关,但我看不出从查找字段中获取计算字段的明显方法。
任何建议赞赏
答案 0 :(得分:1)
事实证明,当使用查找列或带有计算字段的查阅列时,就像我一样,我正在以错误的方式处理事情。 This帖子让我解决了问题。代码也在下面。
基本上我需要访问存储在ListFieldIterator控件中的值,而不是项目中的值。下面的代码(来自上面的链接)提供了一种很好的方法。
public static List<T> GetControlsOfType<T>(this ControlCollection controls)
{
List<T> resultList = new List<T>();
foreach (Control control in controls)
{
if (control is T)
resultList.Add((T)((object)control));
if (control.Controls.Count > 0)
{
resultList.AddRange(GetControlsOfType<T>(control.Controls));
}
}
return resultList;
}
public object GetFieldValue(ListFieldIterator lfi, string fieldName)
{
FormField formField = lfi.Controls.GetControlsOfType<FormField>().Where(f => f.FieldName == fieldName).FirstOrDefault();
if (formField == null) return null;
return formField.Value;
}