3

我在 sharepoint 中有一个查找字段,它仅引用另一个列表。我想知道如何以编程方式枚举该字段的所有可能值?例如,我的查找字段“实际城市”引用列表“城市”和列“标题”,我在那里有 3 个城市。在代码中,我想获取字段“实际城市”的所有可能值的列表,例如(元代码,抱歉):

SPFieldLookup f = myList["Actual City"];
Collection availableValues = f.GetAllPossibleValues();
//this should return collection with all cities a user might select for the field

4

4 回答 4

4

就在前几天,我为我的项目编写了一些代码来处理这个问题。也许它会有所帮助。

    public static List<SPFieldLookupValue> GetLookupFieldValues(SPList list, string fieldName)
    {
        var results = new List<SPFieldLookupValue>();
        var field = list.Fields.GetField(fieldName);

        if (field.Type != SPFieldType.Lookup) throw new SPException(String.Format("The field {0} is not a lookup field.", fieldName));

        var lookupField = field as SPFieldLookup;
        var lookupList = list.ParentWeb.Lists[Guid.Parse(lookupField.LookupList)];
        var query = new SPQuery();

        query.Query = String.Format("<OrderBy><FieldRef Name='{0}'/></OrderBy>", lookupField.LookupField);

        foreach (SPListItem item in lookupList.GetItems(query))
        {
            results.Add(new SPFieldLookupValue(item.ID, item[lookupField.LookupField].ToString()));
        }

        return results;
    }

然后使用它,您的代码将如下所示:

        var list = SPContext.Current.Web.Lists["My List"];
        var results = GetLookupFieldValues(list, "Actual City");

        foreach (SPFieldLookupValue result in results)
        {
            var value = result.LookupValue;
            var id = result.LookupId;
        }
于 2013-06-24T12:11:43.903 回答
0

如果您想枚举所有可能的值,这意味着您基本上想从 Cities 列表中的所有项目中获取所有 Title 字段值。我认为 SharePoint 中没有像 GetAllPossibleValues() 这样的方法,但是您可以仅列出 Cities 中的所有项目并获取它们的标题(如果有的话),或者使用 CAML 查询(如果有的话)。

于 2010-03-31T09:59:23.313 回答
0

据我了解,您想查询所有正在使用的值?

如果是这样,您将必须查询实际城市不为空的项目,查询将类似于:

<Where><IsNotNull><FieldRef Name='Actual City'/></IsNotNull></Where>

然后,对于每个查询的项目,您将

List<SPFieldLookupValue> result = new List<SPFieldLookupValue>(returnedItemCount * 5);

foreach (SPListItem item in queriedItems) {
  object lookup = item["Actual City"];
  SPFieldLookupValueCollection lookupValues = new SPFIeldLookupValueCollection(
    (lookup != null) ? lookup.ToString() : ""
  );
  foreach (SPFieldLookupValue lookupValue in lookupValues) {
    if (!result.Contains(lookupValue)) {
      result.Add(lookupValue);
    }
  }
}

或者您可以使用 HashTable,其中 LookupId 是字符串,LookupValue 是 int id,然后检查HashTable.ContainsKey(lookupId)... 是否必须更快地在哈希表中找到整数而不是列表中的字符串,但是资源密集型部分可能是查询所有项目该字段包含一些值,然后循环...

于 2010-03-31T08:25:10.737 回答
0

我认为没有明确的方法可以返回您想要的。但是SPFieldLookup类存储了手动请求此信息所需的所有信息:LookupFieldLookupList

因此,您可以通过从查找字段使用的列表中获取信息来检索信息。为了使其可重用,您可以将其实现为Extension Method。所以下次你真的可以打电话了f.GetAllPossibleValues();

于 2010-03-31T08:23:44.827 回答