Связь окна WorkSpace и окна во вкладке детализации

Нажимаю в WorkSpace запись в гриде. Должна обновляться новая вкладка в детализации. Нужно событие где я могу получить ID выделенной записи и доступ к окну на вкладке детализации. В принципе можно с события грида писать что то наподобие: ParentWindow.ParentWindow.ComponentsByName('').ComponentsByName('')... - пока не смог прописать цепочку вызовов.

Нравится

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

Михаил, чтобы получить доступ к workspace из грида, то так

var MainWindow = Connector.Attributes('MainWindow');
var WorkspaceWindow = MainWindow.ComponentsByName('wndWorkspace').Window;

Но судя по вопросу вы хотите что-то делать в окне детали в зависимости от того какая запись выбрана.
Грид вам поможет только при переключении на другую запись. А что будете делать если переключилась не запись, а была выбрана другая деталь или это не важно. Так что думаю, это лучше приписать в воркспейс в RefrehsDetails на нужную вам деталь. А получить ID выделенной записи из воркспейса можно так

var ID = wndGridData.Window.ComponentsByName('dlData').Dataset('ID');

В событие grdDataOnSelectionChange получаю я ID

var ID = wndGridData.Window.ComponentsByName('dlData').Dataset('ID');

а как дальше обратиться к окну детали? Как то так не получается:

DataGrid.ParentWindow.ParentWindow.wfmClient.pgTreeRequirement.pgTreeRequirement.wndTreeRequirement

Здравствуйте, Михаил!
Получение окна детали из окна реестра:

Self.Attributes('WorkspaceWindow').ComponentsByName('wndTasksDetail');

Получение ID первой из выделенных записей в реестре:

grdData.SelectedIDs.CommaText.split(',')[0];

Спасибо. Итоговый вариант:

var ID=DataGrid.SelectedIDs.CommaText.split(',')[0];
var wd=Self.Attributes('WorkspaceWindow').ComponentsByName('wndTreeRequirement');
var dlData= wd.Window.ComponentsByName('dlData');
ApplyDatasetFilter(dlData.Dataset, 'ChangeRequestID', ID, true);
dlData.Dataset.Open();

эээ, Михаил, а вы не могли бы объяснить, что вы сделали или хотели сделать.
Такое ощущение, что вы просто обновляете деталь в зависимости от записи, но этот функционал уже давным давно описан. Его можно посмотреть в любом скрипте воркспейса, функция RefreshDetails. Туда просто надо дописать свое по аналогии

if (pcDetails.ActivePage.Name == pgTreeRequirementDetail.Name) { //где pgTreeRegurementDetail - название страницы детали
	RefreshCommonDetail(BaseWorkspace, wndTreeRequirement, 
			'ChangeRequestID', 'ChangeRequestID'); //где один 'ChangeRequestID' - это название фильтра, а другой это родительское поле(т.е. поле которое связано с ID на гриде)
}

Если же у вас дальше идут какие-то манипуляции, то я не знаю зачем переоткрывать датасет.

Да, так совсем хорошо. А что там с переоткрытием Dataset? Не переоткрывается соединение?
RefreshCommonDetail - вшито в ядро -( так что еще вопрос что там происходит

function RefreshCommonDetail не в ядре, а находится в scr_WorkspaceUtils.
Фактически она также переоткрывает датасет, но там стоит много каких-то проверок.
Думаю не просто так разрабы ее создали, но если ваш вариант вас устраивает, то используйте его.

Михаил, чтобы датасет всегда переоткрывался при переходе к детали, задайте для функции function RefreshCommonDetail параметр AlwaysRefresh. Пример:

RefreshCommonDetail(BaseWorkspace, wndTreeRequirement, 
                        'ChangeRequestID', 'ChangeRequestID', null, null, null, true);

"Сазанов Александр Владимирович" написал:

function RefreshCommonDetail не в ядре, а находится в scr_WorkspaceUtils.

Фактически она также переоткрывает датасет, но там стоит много каких-то проверок.

Думаю не просто так разрабы ее создали, но если ваш вариант вас устраивает, то используйте его.


Хм, это террасофт меня в заблуждение ввел. Кликнул по функции, переход не произошел. А вот если открыть scr_WorkspaceUtils и там на вызов кликнуть то переход происходит на определение.

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