Как получить все возможные значения для SPFieldLookup - PullRequest
3 голосов
/ 31 марта 2010

У меня есть поле поиска в sharepoint, которое просто ссылается на другой список. Интересно, как мне программно перечислить все возможные значения для этого поля? Например, мое поле поиска «Фактический город» ссылается на список «Города» и столбец «Заголовок», у меня там 3 города. В коде я хотел бы получить список всех возможных значений для поля «Фактический город», что-то вроде (метакод, извините):

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

Ответы [ 4 ]

4 голосов
/ 24 июня 2013

Я написал код, чтобы справиться с этим для моего проекта только на днях. Возможно, это поможет.

    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;
        }
0 голосов
/ 31 марта 2010

Как я понимаю, вы хотите запросить все используемые значения?

Если это так, вам придется запрашивать элементы, в которых фактический город не равен нулю, запрос будет выглядеть примерно так:

<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) ... быть быстрее, чтобы найти целое число в хеш-таблице, а не строку в списке, но интенсивная часть вероятно, запросить все элементы, где это поле содержит какое-то значение, а затем цикл ...

0 голосов
/ 31 марта 2010

Если вы хотите перечислить все возможные значения, это означает, что вы в основном хотите получить все значения поля Заголовок из всех элементов в списке городов. Я не думаю, что в SharePoint есть такой метод, как GetAllPossibleValues ​​(), но вы можете либо просто перечислить все элементы в Cities и получить их названия, если их всего несколько, либо использовать запрос CAML, если их много.

0 голосов
/ 31 марта 2010

Я думаю, что нет явного метода, возвращающего то, что вы хотите. Но класс SPFieldLookup хранит всю информацию, необходимую для запроса этой информации вручную: LookupField и LookupList

Таким образом, вы можете получить информацию, получив ее из списка, который вы используете в поле поиска. Чтобы сделать его многоразовым, вы можете реализовать его как метод расширения . Так что в следующий раз вы действительно сможете позвонить f.GetAllPossibleValues();.

...