Каскадные списки со множественным выбором - PullRequest
2 голосов
/ 09 октября 2008

Я закончил модификацию источника из общедоступного POC: http://datacogs.com/datablogs/archive/2007/08/26/641.aspx,, который является определением настраиваемого поля для каскадных выпадающих списков. Изменения заключались в том, чтобы разрешить родительские списки со списками, где пользователь может выбрать несколько элементов для фильтрации и выбора значений для записи обратно в список SharePoint. Я получил каскадное поведение «родитель-потомок», но операция сохранения принимает только первое значение, выбранное в списке. Я изменил базовый тип для элемента управления настраиваемого поля с «SPFieldText» на «SPMultiLineText», а также изменил значения определения поля FLD_TYPES с: Текст к заметке, и это не сработало. Итак, я изменил базовый тип управления полем на «SPFieldMultiChoice», а FLD_TYPES - на «MultiChoice» и по-прежнему получаю тот же результат, который является только первым выбранным значением при записи в список SharePoint.

Кто-нибудь знает, как получить настраиваемое поле с несколькими вариантами для записи этих нескольких элементов в список SharePoint?

Спасибо, что нашли время, чтобы прочитать мой пост.

Ура, ~ Питер

1 Ответ

1 голос
/ 19 января 2009

Я смог сделать это, унаследовав от SPFieldLookup и переопределив его внутреннюю обработку AllowMultipleValues:

  1. В вашем наборе FLDTYPES _ *. Xml <ParentType>LookupMulti</ParentType>

  2. В вашем расширении SPFieldLookup обязательно переопределите AllowMultipleValues (всегда true), FieldValueType (возможно, typeof(SPFieldLookupValueCollection)) и FieldRenderingControl. Я также установил base.LookupField = "LinkTitleNoMenu", хотя, оглядываясь назад, я не уверен, почему. :)

  3. В элементе управления вашего редактора полей OnSaveChange() установите для поля Mult значение true.

Чтобы установить Mult, вы можете либо манипулировать строками на field.SchemaXml:

string s = field.SchemaXml;
if (s.IndexOf(" Mult=", StringComparison.OrdinalIgnoreCase) < 0)
    field.SchemaXml = s.Insert(s.IndexOf("/>", StringComparison.Ordinal), " Mult=\"TRUE\" ");

Или используйте отражение:

    var type = field.GetType();
    var mi = type.GetMethod("SetFieldBoolValue", BindingFlags.Instance | BindingFlags.NonPublic);
    mi.Invoke(field, new object[] { "Mult", true });

Это было какое-то время, поэтому я мог бы что-то забыть, но это должно быть большая часть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...