Когда поднимается форма на лукап, а потом в ней выбирается объект, то происходит запрос к сервису. Сервис возвращает список контролов, значения которых нужно изменить, и сами значения.
У контрола имеется свойство:
/// <summary>
/// Добавлять ли используемый тип в ServiceSecurityProvider при использовании контрола
/// </summary>
public bool AddTypeToSecurityProvider = true;
По умолчанию, контрол сам добавит все необходимые типы и название методов в ServiceSecurityProvider, но это будет происходить в рантайме и на конфигурационном XML файле никак не отразится. Поэтому, если необходимо, чтобы все настройки ServiceSecurityProvider брались из файла и не менялись во время исполнения, то нужно добавить в ServiceSecurityProvider.xml
настройки для метода LoadObject
. Если у сервиса не будет полномочий для вычитки объектов из базы, то он всегда будет возвращать пустые значения.
Возможные проблемы
При разворачивании приложения, использующего данный контрол, нужно обязательно удостовериться, что в iis веб-сад
установлен только 1 процесс. Иначе лукапы будут работать “через раз”.
UpdateOnDocumentReady
Использовать данное свойство нужно аккуратно. Свойство отвечает за обновление значения лукапа при загрузке страницы. По-умолчанию, значение свойства false
.
Значение в лукап проставляет WebBinder
, но если по каким-то причинам нужно обновлять лукап во время загрузки страницы, то следует обратить внимание на фокусо на странице и возможные побочные эффекты.
Автодополнение
Имеется возможность по вынесенному мастеровому свойству (например, лукап типа Standard
) добавить автодополнение и по введенному мастеровому свойству будет проставляться значение в лукап. Имеется возможность реализовать схожую функциональность: Связывание AjaxAutocomplete и AjaxLookup.
Для того чтобы включить автодополнение, нужно установить лукапу свойство Autocomplete = true
и убедиться, что лукапу проставляется значение свойства PropertyToShow
(в стандартном случае это делает WebBinder
).
Например,
<ac:MasterEditorAjaxLookUp Autocomplete="true" ID="ctrlВладелецАвтокомплит" CssClass="descTxt" runat="server" />
И у объекта проставлен атрибут
[MasterViewDefineAttribute("КошкаE", "ВладелецАвтокомплит", ICSSoft.STORMNET.LookupTypeEnum.Standard, "", "Имя")]
Для автодополнения можно задать следующие настройки:
/// <summary>
/// Применять ли значение при выборе объекта в autocomplete.
/// </summary>
public bool ApplyOnAutocompleteSelect = true;
/// <summary>
/// Применять ли значение при autocomplete, если сменился фокус.
/// </summary>
public bool ApplyOnAutocompleteLostFocus;
/// <summary>
/// Имя представления для предиктивного ввода.
/// </summary>
public string AutocompleteViewName;
/// <summary>
/// Включить поиск по подстроке для автокомплита.
/// </summary>
public bool IsSubstring;
/// <summary>
/// Свойство для предиктивного ввода - по умолчанию PropertyToShow.
/// </summary>
public string PropertyToAutocomplete;
/// <summary>
/// Свойство для предиктивного ввода - Multiline.
/// </summary>
public TextBoxMode PropertyToAutocompleteMultiline;
/// <summary>
/// Количество символов, с которых начинается предиктивный ввод (по умолчанию 2).
/// </summary>
public int AutocompleteMinChars;
/// <summary>
/// Количество возможных вариантов для выбора при предиктивном вводе (по умолчанию 10).
/// </summary>
public int AutocompleteLimitCount;
Стоит отметить, что для автодополнения вызывается еще один метод сервиса(GetPropertyValues
), поэтому, если изменено свойство AddTypeToSecurityProvider
на false
, то нужно убедиться, что данный тип объекта прописан в ServiceSecurityProvider.xml
.
IsSubstring
имеет значение False
=> без изменения значения в True
поиск по подстроке не будет работать.И в качестве
PropertyToShow
для MasterEditorAjaxLookup
указывать именно это вычислимое свойство.Создание зависимых лукапов
Про создание зависимых лукапов рассказывается в статье Связывание контролов редактирования мастеров.
Кнопка для просмотра
Если указать лукапу свойство ShowObjectUr
l, то рядом с кнопками лукапа появится еще одна кнопка по нажатию на которую можно будет просмотреть мастеровой объект
<uc1:MasterEditorLookUp ID="ctrlВладелец" ShowObjectUrl="~/forms/Vladelec/VladelecE.aspx" CssClass="descTxt" runat="server" />
Также, если у WOLV на поднимающейся форме с лукапа не указан путь к форме редактирования, то ShowObjectUrl
проставится WOLV в качестве EditPage
. Размер всплывающего окна берется из размеров формы, которая поднимается на лукап.
Показ HTML свойств, например, картинки
Если в PropertyToShow
необходимо показать HTML, то необходимо, чтобы у свойства в объекте был атрибут IsHTMLAttribute
(т.е. ViewColumnProvider.GetPropertyIsHTML
от свойства возвращал бы true
).
Задание типов объектов, доступных для выбора в лукапе
Для задания типов отображаемых в MasterEditorAjaxLookUp
объектов используется свойство MasterTypes
:
public Type[] MasterTypes { get; set; }
По умолчанию это свойство хранит типы, заданные для редактируемого свойства объекта в атрибуте TypeUsage. Если же атрибут у соответствующего свойства отсутствует, используется тип из свойства MasterTypeName
и его потомки, при этом выбираются только хранимые классы. Инициализировать свойство MasterTypes
нужно в OnInit
или OnPreInit
.
JS API
Для манипуляций с LookUp на стороне клиента следует использовать LookUp JS API
, который представляет собой jQuery плагин (icsMasterEditorAjaxLookup
).
Операции
Наименование | Параметры | Описание |
---|---|---|
clear | Метод очистки лукапа | |
block | Метод блокировки лукапа. Блокирует поле ввода и установливает флаг блокировки обработчиков кликов по кнопкам | |
show | Метод запуска окна лукапа | |
unblock | Метод разблокировки лукапа. Разблокирует поле ввода и сбрасывает установленный флаг блокировки обработчиков кликов по кнопкам | |
val | value | Метод установки значения лукапа. Лукапу ставится значение value |
updateOptions | См. таблицу ниже. | Метод обновления опций плагина |
Параметры updateOptions
Параметр | Описание | |
---|---|---|
Свойства лукапа |
||
LFName | Наименование LimitFunction, хранящейся в сессии | |
viewname | Наименование представления, аналогично свойству лукапа MasterViewName |
|
typename | Наименование используемого типа, аналогично свойству лукапа MasterTypeName |
|
connStrName | Наименование строки подключения, аналогично свойству лукапа ConnStrName |
|
nameValueControl | ClientID лукапа, в который будет проставлено значение с лукап-формы, OBSOLETE |
|
FormCaption | Заголовок открываемой на лукап формы, аналогично свойству лукапа LookUpFormCaption |
|
CountOnPage | Количество элементов на странице WOLV’а страницы-лукапа, аналогично свойству лукапа LookUpFormCountOnPage |
|
EditPage | Страница редактирования элементов WOLV’a страницы-лукапа | |
csdName | Наименование настройки хранения столбцов, хранящейся в сессии | - |
Свойства открываемой формы |
||
width | Ширина формы, по умолчанию 800 |
|
height | Высота формы, по умолчанию 600 |
|
left | Отступ слева | |
top | Отступ сверху | |
status | Текст в статусбаре у стандартного браузерного окна | |
resizable | Можно ли изменять размер окна | |
menubar | Показывать ли меню браузера | |
toolbar | Показывать ли toolBar браузера | |
caption | Заголовок окна | |
Прочие параметры |
||
useDefaultWindow | Использовать браузерное окно для открытия лукап-формы, по умолчанию false |
|
formParams | Url-параметры окна лукапа | |
url | Ссылка для окна лукапа | |
additionalControls | Связанные лукапы |
Практическая реализация
Кнопки, которые будут:
- очищать лукап
- блокировать лукап
- разблокировать лукап
- открывать форму лукапа
- подменять адрес формы лукапа
Добавить клиентские кнопки и повесить обработчики onclick
:
<button onclick="$('#<%=ctrlИнспектор.ClientID%>').icsMasterEditorAjaxLookup('unblock'); return false;">РАЗБЛОКИРОВАТЬ</button>
<button onclick="$('#<%=ctrlИнспектор.ClientID%>').icsMasterEditorAjaxLookup('block'); return false;">ЗАБЛОКИРОВАТЬ</button>
<button onclick="$('#<%=ctrlИнспектор.ClientID%>').icsMasterEditorAjaxLookup('clear'); return false;">ОЧИСТИТЬ</button>
<button onclick="$('#<%=ctrlИнспектор.ClientID%>').icsMasterEditorAjaxLookup('show'); return false;">ОТКРЫТЬ</button>
<button onclick="$('#<%=ctrlИнспектор.ClientID%>').icsMasterEditorAjaxLookup('updateOptions', {lookup:{LFName:'LFName1'}}); return false;">Настройки</button>
return false;
будет происходить PostBack и ничего работать не будет.Для вызова JS API MasterEditorAjaxLookup
при загрузке страницы нужно вызывать эти функции в самом конце события ready
. Для этого существует несколько способов:
1.Обработка события load
.
$(window).load(function () {
$('#<%=ctrlСтруктурноеПодразделение.ClientID %>').icsMasterEditorAjaxLookup('block');
$('#<%=ctrlСтруктурноеПодразделение.ClientID %>').icsMasterEditorAjaxLookup('clear');
});
2.Использование трюка добавления обработчика события ready
при обработке этого же события. Данный способ работает, так как обработчики выполняются в том порядке, в котором они были добавлены.
$(function () {
$(function() {
$('#<%=ctrlСтруктурноеПодразделение.ClientID %>').icsMasterEditorAjaxLookup('block');
$('#<%=ctrlСтруктурноеПодразделение.ClientID %>').icsMasterEditorAjaxLookup('clear');
});
});
Установка значения MasterEditorAjaxLookup
Например, если по нажатию кнопки changeMasterLookUpValue
должно изменяться значение MasterEditorAjaxLookup
ctrlLimitEditorMaster1
на указанное в контроле masterLookUpValues
, то:
$(document).ready(function () {
$('#<%= changeMasterLookUpValue.ClientID %>').click(function () {
$('#<%=ctrlLimitEditorMaster1.ClientID%>').icsMasterEditorAjaxLookup('val', $('#<%=masterLookUpValues.ClientID%>').val());
return false;
});
});
События
Событие | Описание |
---|---|
change | Срабатывает после выбора значения мастера и “размазывания” значений лукапа по контролам |
Практическая реализация контрола
См. LookUp.