27.03.2024, 20:51 | #1 |
Участник
|
Метод isVisible класса FormControl. Что он делает ?
Вопрос (Ax 2012).
Как работает метод isVisible класса FormControl ? Я раньше думал что это просто сумма (через И) методов visible() для контрола, поля датасорса и поля таблицы X++: (formControl.visible() && formDataObject.visible() && dictField.visible() ) Есть исключения. Например, если в форме несколько закладок (tabPage) и контрол расположен не на 1-й закладке то при после открытия формы для него isVisible вернет false. Но при переключении на нужную вкладку, начинает возвращать true. Похоже сделана ленивая инициализация значения в целях оптимизации. Также если на форме несколько датасорсов и идет изменение свойства visible для контрола и содержащих его групп, то неожиданно значение может "залипнуть" даже при переключении на нужную вкладку. Метод все равно возвращает false. Но если сделать reread на датасорсе то "отмыкает" и значение становится правильным. Пришлось написать свой метод isVisible который работает всегда как надо. Но может быть я просто не понимаю как он должен работать ? В документации внятного описания не нашел. В гугле тоже молчок. Есть еще isDisplayed. Он просто выводит, видим ли в данный момент контрол для пользователя (стоим на нужной вкладке и контрол виден, значит true, переключились на другую вкладку - false) Последний раз редактировалось Logger; 27.03.2024 в 21:10. |
|
27.03.2024, 21:00 | #2 |
Участник
|
Зачем все это потребовалось.
У нас сделана модификация, которые на формах скрывает родительский контрол, если в нем нет видимых дочерних. Это потребовалось, так как свойство HideIfEmpty не отрабатывает, если элементы управления скрыты через поля датасорса. И element.redraw() не помогает. Но как выяснилось что модификация работала не всегда. Иногда вела себя странно. Разборки привели к виновнику, которым оказался isVisible Возможно поэтому и HideIfEmpty мог не отрабатывать. Возможно он тоже использует результат работы formControl.isVisible() |
|
31.03.2024, 22:16 | #3 |
Участник
|
В лоб - не воспроизводится.
|
|
20.08.2024, 20:26 | #4 |
Участник
|
метод замена
X++: public static boolean isVisible_MRC(FormControl _formControl) { DictField dictField; FieldId fieldId; FormDataObject formDataObject; boolean ret = true; ; if (!_formControl) { return false; } if (!_formControl.visible()) { return false; } if (_formControl.fieldBinding() && _formControl.dataSourceObject()) { fieldId = _formControl.fieldBinding().fieldId(); if (fieldId) { formDataObject = _formControl.dataSourceObject().object(fieldId); if (formDataObject && !formDataObject.visible()) { return false; } dictField = new DictField(_formControl.fieldBinding().tableId(), fieldId); if (dictField && !dictField.visible()) { return false; } } } return ret; } |
|
|
За это сообщение автора поблагодарили: dech (3). |