在查找字段中的Sharepoint计算字段

时间:2012-08-07 11:03:58

标签: c# .net sharepoint sharepoint-2010

我无法从列表中访问计算字段的值,该列表位于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似乎有关,但我看不出从查找字段中获取计算字段的明显方法。

任何建议赞赏

1 个答案:

答案 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;
}