Меняющийся список пунктов меню в кнопке

Здравствуйте.
Использую версию системы 5.4.1.1034

Создала новую кнопку в реестре документов, у этой кнопки создала список. Т.е. при нажатии на кнопку вываливается список. При нажатии на один из пунктов запускается процесс, который описан в дизайнере процесса карточки.
Мне нужно, чтобы этот список менялся, т.е. какие то пункты скрывались, а какие то отображались, при смене активной строки реестра. Если быть конкретнее, то в зависимости от вида документа, который сейчас выбран в реестре, должен быть отображен тот или иной список пунктов меню.

Я так понимаю, что логику нужно накладывать на событие DataSourceActiveRowChanged.
А дальше что делать?
Пробовала удалять меню кодом, потом подпихивать новые пункты и скриптом и просто хиденом:

var button = Page.Print;
var menu = button.Menu;
menu.RemoveAll();
               
var esquery = new EntitySchemaQuery(UserConnection.EntitySchemaManager, Page.DataSource.Schema.Name);
esquery.AddAllSchemaColumns();
var entity = esquery.GetEntity(UserConnection, SelectedNodePrimaryColumnValue);

if(entity == null){
        //button.Hidden = false;
        return true;
}

Guid DocumentId = entity.GetTypedColumnValueGuid>("Id");

Guid documentCategoryId = entity.GetTypedColumnValueGuid>("CategoryId");
Guid DocumentCategory_SPokupatelem = (Guid)Core.Configuration.SysSettings.GetValue(UserConnection, "DocumentCategory_SPokupatelem");


if(documentCategoryId == DocumentCategory_SPokupatelem) {
string script = string.Empty;
var menuItem1 = Page.MenuItem1;
var menuItem2 = Page.MenuItem2;
menu.Add(menuItem1);
menu.Add(menuItem2);   
                script = string.Format("window.{0} = {1};\n", menuItem1.ClientID, menuItem1.GenerateControlScript(true, null));
                script += string.Format("{0}.getMenu().addItem(window.{1});\n", button.ClientID, menuItem1.ClientID);
                //script += string.Format("{0}.getMenu().addSeparator();\n", button.ClientID);
       
                                script = string.Format("window.{0} = {1};\n", menuItem2.ClientID, menuItem2.GenerateControlScript(true, null));
                                script += string.Format("{0}.getMenu().addItem(window.{1});\n", button.ClientID, menuItem2.ClientID);
Page.AddScript(script);
                Page.MenuItem1.Hidden = false;
                Page.MenuItem2.Hidden = false;
                Page.MenuItem3.Hidden = false;
                Page.MenuItem4.Hidden = false;
                Page.MenuItem5.Hidden = false;
                Page.MenuItem6.Hidden = false;
                Page.MenuItem7.Hidden = false;
}

Нравится

5 комментариев

Антонина, а если заранее добавить все возможные пункты меню, а потом лишние скрывать при помощи свойства «Hidden»?

А разве в таком случае при смене активной строчки реестра, меню кнопки обновляется?
В настройках полей карточки сделала чтоб показывались все пункты, а в коде по сигналу DataSourceActiveRowChanged сделала так как ниже, показывает все пункты, как-будто на код вообще не реагирует.

var esquery = new EntitySchemaQuery(UserConnection.EntitySchemaManager, Page.DataSource.Schema.Name);
esquery.AddAllSchemaColumns();
var entity = esquery.GetEntity(UserConnection, SelectedNodePrimaryColumnValue);
 
if(entity == null){
	Page.Print.Hidden = false;
	return true;
}
 
Guid DocumentId = entity.GetTypedColumnValue<Guid>("Id");
 
Guid documentCategoryId = entity.GetTypedColumnValue<Guid>("CategoryId");
Guid DocumentCategory_SPokupatelem = (Guid)Core.Configuration.SysSettings.GetValue(UserConnection, "DocumentCategory_SPokupatelem");
 
 
if(documentCategoryId == DocumentCategory_SPokupatelem) {
		Page.MenuItem1.Hidden = true;
		Page.MenuItem2.Hidden = true;
		Page.MenuItem3.Hidden = true;
		Page.MenuItem4.Hidden = true;
		Page.MenuItem5.Hidden = true;
		Page.MenuItem6.Hidden = true;
		Page.MenuItem7.Hidden = true;
}	
else{
		Page.NewItem.Hidden = true;
		Page.New2Item.Hidden = true;
}

А если попробовать скрывать не через свойство «.Hidden», а методом «.SetVisible(false)»?

Александр, добрый день.
И метод «.Hidden» и метод «.SetVisible(false)» в данном случае работают одинаково, т.е. скрывают/отображают пункты меню при необходимости. Но делают они это при загрузке страницы реестра.
Т.е. когда я открываю раздел документооборот, загружается страница реестра и отображает тот список меню кнопки, в соответствии с первой строкой реестра, т.к. она выделена. Затем же при переходе на другие строки реестра, меню кнопки не обновляется.

Получается тут 2 варианта:
- либо я использую не тот сигнал. А использую я DataSourceActiveRowChanged, вроде как все правильно.
- либо меню кнопки не перестраивается при смене активной позиции в реестре. Значит вопрос как это делать?
Или я не правильно мыслю?

Антонина, ваше первое предположение можно проверить, установив отладчик в скрипте-обработчике события. Если при смене строки срабатывает — сигнал тот.

По второму, посмотрел в кодах всех конфигураций, которые были под рукой, и нигде сходу не нашёл такого примера работы с пунктами меню. Возможно, действительно есть какие-то ограничения. Кроме двух ранее использованных способов, можно попробовать скрывать ещё в клиентском скрипте по ClientId, вызывая там «.setVisible(false)» (с маленькой «s»).

Если и это не даст результатов, придётся использовать другие подходы в интерфейсе, вроде отдельного диалогового окна со списком пунктов или заглушек при попытке запустить неподходящий пункт меню. Кстати, если менять не видимость, а доступность пунктов, не реагирует так же само?

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