Здравствуйте, уважаемые коллеги!

Решил попробовать в 3.3.2.266 галочки в TreeGrid. Как раз и случай подходящий: окошко что-то вроде того, что показывает мастер-инсталлятор, с древовидным представлением устанавливаемых компонентов. Всё шло отлично, пока не потребовалось менять значения галочек программно. Например, поставили галочку на родительской - должны появиться галочки на всех дочерних, логично?

Пример окна с галочками

Перебрал бы рекурсией, да не тут-то было. Я не нашёл, что перебирать! Галочки напрямую не связаны со значением поля.

В SDK указано, что
Изменение значения флажка в реестре не влияет на значение соответствующего поля в наборе данных. Таким образом, синхронизация значений происходит вручную.

Значит, поля не годятся. Синхронизация значений происходит вручную... Очень хочется увидеть. Кто-нибудь делал что-то подобное? Ведь даже кликнутые галочки мне приходится запоминать в событии grdDataOnChecking в глобальном объекте скрипта, потому что больше негде. Явно я что-то упустил.

Итак, вопросы: как получить программно доступ к значениям "галочек" и можно ли программно изменить эти значения?

Нравится

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

Здравствуйте, Анатолий!

Пример работы с CheckBoxDataFieldName можно подсмотреть в базовой версии в разделе Планирование, а именно дерево периодов, которое расположено в левой части раздела. Если еще точнее, то это сервис: wnd_PlanningViewPeriodTree

Если что, задавайте вопросы. Постараюсь оперативно ответить.

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

В таблицу, sq и датасет Вам необходимо добавить булевское поле, назвав его, к примеру, IsSelected.
Свойству CheckBoxDataFieldName для грида устанавливаем значение IsSelected.
Далее, в обработчике события grdDataOnChecking(DataGrid, Checked, CanChange) прописываем приблизительно следующий код:

var Dataset = dlData.Dataset;
Dataset.DisableEvents();
Dataset.Edit();
Dataset('IsSelected') = Checked.Value;
Dataset.Post();
RecordNumber = Dataset.RecordNumber;
var ParentID = Dataset('ParentID');
if ((Checked.Value) && (!IsEmptyValue(ParentID))) {
	Dataset.Locate('ID', ParentID);
	Dataset.Edit();
	Dataset('IsSelected') = Checked.Value;
	Dataset.Post();
	Dataset.RecordNumber = RecordNumber;
}
Dataset.EnableEvents();
Refresh();

"Alexandr Kravchuk" написал:сервис: wnd_PlanningViewPeriodTree

Здравствуйте, Александр!

Спасибо за отличный пример - в этом окне есть всё то, чего мне не хватало чтобы разобраться в работе с галочками. Не ожидал, что это действительно надо делать так: ведь получается, что мы скриптово делаем то же самое, как если бы в гриде было редактируемое булевское поле.

Мне с галочками очень нравилось как раз то, что они независимы от значений Datafieldа. А конструкция вида

"Олейник Дмитрий" написал:
Dataset.Edit();
Dataset('IsSelected') = Checked.Value;
Dataset.Post();

по сути - имитация редактируемого поля в гриде. Я очень хотел применить эти галочки как способ выбрать записи, а не отредактировать. Этим окном одновременно может пользоваться несколько пользователей (представьте, какой разнобой начнётся, если один будет снимать галочки, которые поставил другой), к тому же пользователи не всегда имеют права изменять значения в этих таблицах, а в довершение всего это не простой датасет, это UNION из пяти различных таблиц... Редактировать как раз и нельзя!

Хотя... Может сделать вычисляемое поле.... Правда, едва представлю как пройдётся вызов .CalcDataFields() по всем полям ради одного - так сомнения и разбирают, вдруг ещё способ есть...

Скажите, а точно до самих СheckBox - контролов не дотянуться? Раз они есть на карточке - они есть и в жизни, хотя может спрятаны от публики в глубине объекта. Не предусмотрено у нас какого-то приёма, чтобы их вытащить?

"Олейник Дмитрий" написал:

Спасибо, Дмитрий! Шикарный пример, всё предельно ясно! Но так же как и в wnd_PlanningViewPeriodTreeScript изменяется значение поля в самом датасете. Хотелось бы обойтись без этого, и считывать/устанавливать сами галочки напрямую...

Кстати, ещё можно Memory-датасет попробовать. Подумаю. Спасибо за помощь!

"Будак Анатолий Васильевич" написал:Этим окном одновременно может пользоваться несколько пользователей (представьте, какой разнобой начнётся, если один будет снимать галочки, которые поставил другой), к тому же пользователи не всегда имеют права изменять значения в этих таблицах, а в довершение всего это не простой датасет, это UNION из пяти различных таблиц...

Анатолий, в сервисе wnd_PlanningViewPeriodTree используется MemoryDataset и его значение сохраняется в профиль пользователя. Поэтому там эти "галочки" используются именно для выбора, как вам и нужно. :wink:

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