我在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
答案 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课程会存储您手动申请此信息所需的所有信息:LookupField和LookupList
因此,您可以通过从查找字段使用的列表中获取信息来检索信息。为了使其可重用,您可以将其实现为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查询。