1) Сначала в контрол типа LookUp добавляем кнопку (обычный Button) как дочерний элемент
2) Далее в нужном месте добавляем в её меню элементы (на примере молнии ConfigurationItemToolButton)

var menuItem = CreateMenuItem(configurationItemName, configurationItemId.ToString(), "ItemClick_Yw", Page.ConfigurationItemToolButton.ClientID);
Page.ConfigurationItemToolButton.Menu.AddCaptionItem(menuItem);
Page.AddScript(string.Format("{0}.init_ev()", menuItem.ClientID));

ConfigurationItemToolButton - сама кнопка SmartTag
configurationItemName - будет Caption нашего пункта, например, название элемента
configurationItemId - GUID выбираемого элемета, который присвоим нашему LookUp-полю в случае его выбора, кладём в Tag пункта меню

3) На событии Init создаём подписку по нажатию пункта меню этой кнопки, где сами определяем, какая должна быть логика, логично, что должна быть установка значения в Lookup , но это надо написать самим, так как логика может быть любой:

Page.ConfigurationItemToolButton.AjaxEvents.MenuItemClick.Event += delegate(object sender, Terrasoft.UI.WebControls.Controls.AjaxEventArgs e) {
string ConfigurationItemIdString = e.ExtraParameters[2].Value.ToString();
int LocUnderChar = ConfigurationItemIdString.LastIndexOf("_");
if (LocUnderChar > 0)
ConfigurationItemIdString = ConfigurationItemIdString.Remove(0,LocUnderChar+1);
var clickedMenuItemCode = new Guid(ConfigurationItemIdString);                        
Page.DataSource.ActiveRow.SetColumnValue("ConfigurationItemId", clickedMenuItemCode);
Page.DataSource.ActiveRow.LoadLookupDisplayValues("ConfigurationItem");
};

Тут e.ExtraParameters[2].Value передаётся не совсем GUID, поэтому пришлось немного обрезать.
Ниже код метода CreateMeniItem и CreateSeparatorMenuItem

protected virtual Terrasoft.UI.WebControls.Controls.MenuItem CreateMenuItem(string caption, string tag, string signalName, string targetControlID) {
                        var menuItem = new Terrasoft.UI.WebControls.Controls.MenuItem(caption);
menuItem.Tag = tag;
menuItem.AjaxEvents.Click.SignalName = signalName;
menuItem.Name = "menuItem_" + Guid.NewGuid().ToString("N");
menuItem.CreatedByAjax = true;
menuItem.AjaxEvents.Click.AjaxEventTargetControlID = targetControlID;
return menuItem;
                }

                protected virtual MenuSeparator CreateSeparatorMenuItem(string caption) {
                        return new MenuSeparator {
        Name = "menuItem_" + Guid.NewGuid().ToString("N"),
        Caption = caption,
        CreatedByAjax = true
};
}

Нравится

Поделиться

0 комментариев
Показать все комментарии
Вопрос

Здравствуйте!
Нет ли, случайно, документации по созданию SmartTag?

Поиск ничего не дал. Была бы очень благодарна :)

Нравится

4 комментария

Посмотрите здесь.

Спасибо, Олег, но это не совсем то. Это конкретно для Lookup, с использованием scr_SmartLookupUtils. Я ищу SmartTag для выпадающего меню, с использованием scr_SmartTagUtils.

Я так поняла, что создание SmartTag предусмотрено стандартными средствами, по этому и решила, что где-то есть документация.

Как таковой, документации нет. Лучше всего за примерами использования обратиться к скрипту wnd_IncidentEditScript: в окне редактирования инцидентов наиболее активно используются эти меню.

Если коротко, Вам необходимо в своём окне редактирования добавить новое меню действий (ActionMenu), заполнить его свойства Name, ImageList (обычно ilControlWarnings) и Tag, если нужно. Далее в него добавить новый элемент (ActionMenuItem), заполнив свойства ImageName и PressedImageName для изображений SmartTag. Иногда есть необходимость создать ещё один подчинённый элемент для случая, когда значение отсутствует.

Далее необходимо подключить к скрипту окна редактирования скрипт scr_SmartTagUtils. В зависимости от заданий по реализации, для формирования меню и работы с ним можно использовать функции из этого скрипта (amiCustomSmartTagOnPrepare, amiCustomSmartTagOnExecute) либо свои функции (в скрипте wnd_IncidentEditScript - amiSetContactByAccountOnExecute и т.д.).

В скрипте должны быть функции для очистки меню смарт-тэгов и его формирования. Дальше всё зависит от конкретной задачи, но основной принцип работы такой: при изменении значения одного поля вызывается функция формирования меню или его очистки для другого поля. Например:

	if (Name == 'OfferingID') {
/* PRODUCT SERVICEDESK */
		ProcessChangeOffering(Dataset);
		ProcessClearProblemSmartTag();
		ProcessClearReleaseSmartTag();
/* ENDPRODUCT SERVICEDESK */
	    return;
	}

В данном случае при изменении поля "Продукт" в карточке редактирования инцидента происходит очистка смарт-тэг-меню для полей "Проблема" и "Релиз". А для того, чтобы они заполнились в зависимости от выбранного значения, при обработке OnDatasetDataChange после действий по изменению полей вызывается функция обработки изменений смарт-тэгов:

function dlDataOnDatasetDataChange(DataField) {
	DataChange(DataField);
	SmartLookupOnDataChange(DataField);
}

Посмотрите также другие примеры использования смарт-тэгов в скрипте карточки редактирования инцидентов.

Спасибо за описание! :)

Показать все комментарии