0

我无法从 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”,这是我选择的项目列表中的位置。(它会根据我选择的列表中的项目而变化)

这篇文章获取计算字段的值似乎相关,但我看不到从查找字段中获取计算字段的明显方法。

任何建议表示赞赏

4

1 回答 1

1

事实证明,当使用查找列或带有计算字段的查找列时,就像我一样,我做错了事情。这篇文章让我找到了解决方案。代码也在下面。

本质上,我需要访问存储在 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;
}
于 2012-08-14T10:16:50.947 回答