Связь окна WorkSpace и окна во вкладке детализации
Нажимаю в WorkSpace запись в гриде. Должна обновляться новая вкладка в детализации. Нужно событие где я могу получить ID выделенной записи и доступ к окну на вкладке детализации. В принципе можно с события грида писать что то наподобие: ParentWindow.ParentWindow.ComponentsByName('').ComponentsByName('')... - пока не смог прописать цепочку вызовов.
Нравится
Михаил, чтобы получить доступ к 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 и там на вызов кликнуть то переход происходит на определение.