Я смог сделать это, унаследовав от SPFieldLookup
и переопределив его внутреннюю обработку AllowMultipleValues
:
В вашем наборе FLDTYPES _ *. Xml <ParentType>LookupMulti</ParentType>
В вашем расширении SPFieldLookup
обязательно переопределите AllowMultipleValues
(всегда true
), FieldValueType
(возможно, typeof(SPFieldLookupValueCollection)
) и FieldRenderingControl
. Я также установил base.LookupField = "LinkTitleNoMenu"
, хотя, оглядываясь назад, я не уверен, почему. :)
В элементе управления вашего редактора полей 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 });
Это было какое-то время, поэтому я мог бы что-то забыть, но это должно быть большая часть.