如何获取SPFieldLookup的所有可能值

时间:2010-03-31 07:35:39

标签: sharepoint spfield

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

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

4 个答案:

答案 0 :(得分: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;
        }

答案 1 :(得分:0)

我认为没有明确的方法可以返回你想要的东西。但SPFieldLookup课程会存储您手动申请此信息所需的所有信息:LookupFieldLookupList

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

答案 2 :(得分:0)

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

如果是这样,您将不得不查询Actual City不为null的项目,查询将类似于:

<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) ...是否必须更快才能找到哈希表中的整数而不是列表中的字符串,但是资源密集型部分是可能查询该字段包含某些值的所有项目,然后循环...

答案 3 :(得分:0)

如果要枚举所有可能的值,则表示您基本上希望从“城市”列表中的所有项目中获取所有“标题”字段值。我认为在SharePoint中没有类似GetAllPossibleValues()的方法,但您可以只列出城市中的所有项目并获取其标题(如果只有少数),或者如果有足够的话则使用CAML查询。