На какое событие повесить скрытие полей в зависимости от типа?

Здравствуйте.
Такая проблема.
В карточке инцидента должны отображаться определённые поля в зависимости от типа инцидента.
Как это можно реализовать/где посмотреть примеры?
Спасибо.

Нравится

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

Здравствуйте.

Создайте функцию:

function hideSomeFields(Dataset)
{
var IncidentTypeID = '{paste_ID_here}';
if (Dataset('TypeID') == IncidentTypeID)
{
edtSomeField.IsVisible = true;
edtSomeField1.IsVisible = false;
edtSomeField.IsEnabled = false;
}
else
{
edtSomeField.IsVisible = false;
edtSomeField1.IsVisible = true;
edtSomeField.IsEnabled = true;
}
}

И вызывайте её на OnPrepare окна карточки редактирования. А также на OnDatasetDataChange(DataField) для объекта dlData:

if (DataField.Name == 'TypeID')
{
hideSomeFields(DataField.ParentDataFields.ParentDataset);
}

Спасибо, разобрался.

Нужно решить ту же задачу.
Создал функцию hideSomeFields(Dataset). На событии OnPrepare все отрабатывает, но при выполнении функции на событии OnDatasetDataChange пишет, что 'edtSomeField' - определение отсутствует.
Подскажите, пожалуйста, что можно с этим сделать?

Добрый день, Дмитрий! Можно взглянуть на Ваш код полностью (или сервис)?
Полагаю Вы где-то ошибку допустили, адаптируя приведенный выше пример под свои реалии. При этом на событие OnPrepare ошибок может не быть, если не выполняется условие (Dataset('TypeID') == IncidentTypeID), но реализуемая логика тоже работать, как этого ожидается, не должна.

Код в карточке редактирования:

function hideSomeFields(Dataset)
{
	if (Dataset('ChargesTypeID') != null)
	{
		fg1.IsVisible = true;
	}
	else
	{
		fg1.IsVisible = false;
	}
}
 
function wnd_ChargesEditOnPrepare(Window) {
	wnd_BaseDBEditOnPrepare(Window);
	var Dataset = dlData.Dataset;
	hideSomeFields(Dataset);
}

и код в датасете

function ds_ChargesOnDatasetDataChange(DataField) {
	var DataFields = DataField.ParentDataFields;
	var Dataset = DataFields.ParentDataset;
	if (DataField.Name == 'ChargesTypeID')
	{
		hideSomeFields(DataField.ParentDataFields.ParentDataset);
	}
}

"Молчанов Дмитрий Павлович" написал:и код в датасете

Его надо не в датасете, а тоже в карточке, на событии DataChange датасета карточки.

Дмитрий, какая ошибка возникает?
Вы пишите "при выполнении функции на событии OnDatasetDataChange пишет, что 'edtSomeField' - определение отсутствует" - однако в коде нет обращения к edtSomeField.
Александр верно заметил, логику нужно прописывать в скрипте карточки, а не датасета.

А в скрипте карточки нет же события OnDatasetDataChange. Поэтому делаю в скрипте датасета.
А ошибка возникает следующая: fg1 - Определение отсутствует.
fg1 - это FrameGroup в карточке, который мне нужно скрыть в зависимости от условий

"Молчанов Дмитрий Павлович" написал:А в скрипте карточки нет же события OnDatasetDataChange.

Так создайте. Откройте в дизайнере карточки события её датасета и создайте обработчик нужного события.

Спасибо. Теперь понял.

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