Система не видит поле на странице

Добрый день!

Столкнулся со следующей проблемой. На гриде детали добавил поле числового типа с названием "MinPurchaseAmountEdit". Мне необходимо при переходе на эту страницу детали этому полю задавать некоторое значение. Делаю я это в событии "PageLoadComplete" (пробовал также в "Init"):

0

Код следующий:

Page.MinPurchaseAmountEdit.Value = 10m;

Компилируется всё отлично. Дебажится тоже. Присваиваемое значение "10" в формате "decimal" присваивается! Но, на самой странице в консоли возникает странное уведомление:

Uncaught ReferenceError: PageContainer_DetailGridContainer8021c0aacccf410e8f1da5c600f5d6ad_MinPurchaseAmountEdit is not defined

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

2

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

Нравится

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

Можно ещё попробовать присваивать значение контролу при помощи метода:

Page.MinPurchaseAmountEdit.SetValue(10m);

Или же писать в поле источника данных:

Page.DataSource.ActiveRow.SetColumnValue("MinPurchaseAmount", 10m);

Спасибо, Александр, что подсказали, но:
- в первом варианте ошибка та же: система не видит контрола на странице (та же ошибка в консоли браузера);
- во втором случае даже страница не открылась, а система выдала ошибку:

Exception Message: Ссылка на объект не указывает на экземпляр объекта.
Exception Type: System.NullReferenceException
Exception Source: TSBpm

Думаю, тут дело не в присваивании значения полю контрола, а в том, что его надо как-то объявить, чтоб система увидела, что такой контрол есть на моей странице. Но это уже получается "масло масляное", т.к. специальных действий после добавления контрола на страницу вроде не надо проводить и система сама должна его видеть. Тем более в исходном коде страницы есть объявление и создание моего контрола:

3

Возможно, дело в том, что это деталь с гридом, а не карточка.
И на момент PageLoadComplete её источник данных ещё не привязан к конкретной записи. А поле привязано к источнику.

Не знаю, что именно хотите сделать, но, может, надо было вязать к событию смены записи на самом гриде (детали) DataSourceActiveRowChanged или событию смены записи в основном реестре (разделе) GridPageRefreshRow.

У меня задача в том, чтобы заполнять это поле "MinPurchaseAmountEdit" данными из БД, и заполняться она должна в момент первого обращения к странице детали, а именно в момент перехода на неё после открытия карточки, к которой привязана деталь. Здесь событие смены записи на самом гриде или в основном реестре точно не подойдут.

Дело в том, что для всех записей этого грида значение "MinPurchaseAmountEdit" одинаково и мне нужно выводить это значение (если оно отлично от нуля!) и присваивать это значение контролу. Это всё при первом переходе на грид детали. Непонятно, почему кнопки, которые на этой детали находятся ("Добавить", "Изменить" и др.) обнаруживаются и на них система не ругается, а при добавлении контрола в этот же контейнер к кнопкам BPM его (контрол) не видит...

Кроме того, "на момент PageLoadComplete её источник данных ещё не привязан к конкретной записи" - тут дело даже не в источнике данных, т.к. я просто работаю с элементами на странице:

Page.MinPurchaseAmountEdit.SetValue(10m);

Здесь событие смены записи на самом гриде или в основном реестре точно не подойдут.

Всё же лучше и их попробовать, они могут вызываться и при первом выборе записи.

Ещё непонятно, зачем Вы привязываете поле ввода к полю датасорса (вероятно, датасорса детали), если оно никак не связано с выбранной записью. На скриншоте свойств это видно. Если это просто программно наполняемый элемент, то этой связи и не нужно.

"они могут вызываться и при первом выборе записи." - но ведь поле должно обновляться при первичном открытии страницы этой детали. Неужели такой возможности нет в функционале BPM?

Сделал поле без привязки к БД:

4

Ошибка та же самая - система не видит моего контрола. Куда ещё "копать"?

P.S.: Значение "UId" на скринах разное, т.к. я удалял элемент, компилировал и добавлял новый такой же, чтобы убрать его привязку к БД, иначе система ругается - NullReferenceException...

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

Странно... Просто возникает тогда другой вопрос: если после события завершения загрузки страницы (см. скрин бизнес-процесса) система не видит все контролы на этой странице, то...... когда же они там инициализируются? Вопрос, видимо, философский((

Всё равно спасибо, Александр, что поучаствовали в обсуждении. Хорошего Вам дня!

Да, действительно странно. А Вы пробовали именно с полем ввода, если выводить в название кнопки или простой надписи, то отрабатывает нормально?

Попробовал добавить надпись с названием "Label1" и заголовком "Надпись 1", предварительно удалив поле ввода дробного числа и скомпилировав модуль. После этого в то же событие "PageLoadComplete" добавил код:

Page.Label1.Caption = "etqtert";

Когда скомпилировал модуль и открыл страницу детали, она открылась!!!! Но:

5

Вопрос: откуда там взялся контрол, который я до этого удалил - непонятно... И в структуре он тоже был. Но самое приятное то, что "Caption" у надписи поменялся (заметить по картинке трудно, но возможно)! При этом код:

Page.MinPurchaseAmountEdit.SetValue(10m);

был закомментирован.

Я удалил поле ввода дробного числа снова, удалил надпись, закомментировал код по переприсвоению "Caption" в надписи и раскомментировал код по установке значения в "MinPurchaseAmountEdit". Скомпилировал. Страница детали не открылась... :cry: Ошибка та же.

ВЫВОД: Изменение поля ввода дробного числа нельзя изменять ни в одном событии страницы до того пока она хотя бы один раз не прорисуется (ну или лыжи не едут...). Но это не применимо к остальным контролам. К сожалению(

А для поля ввода строки такое же самое поведение, что и для поля ввода числа?

Да, эти контролы ведут себя одинаково: поле ввода строки тоже не определено в событии "MinPurchaseAmountEdit". Ошибка та же.

Судя по сообщению:

Uncaught ReferenceError: PageContainer_DetailGridContainer8021c0aacccf410e8f1da5c600f5d6ad_MinPurchaseAmountEdit is not defined

На уровне веб-страницы контрол есть (раз его видно), но по такому названию его найти не может. Может, посмотреть на уровне браузера, как действительно это поле называется?

Контрол идентифицируется браузером как:
http://i.piccy.info/i9/d0f1d2f7db16bc88df4890afcb8e71e5/1458115070/2764…

ПРИ ЭТОМ! Если никаких обращений к этому контролу ни в каком событии не писать, типа:

Page.MinPurchaseAmountEdit.SetValue(10m);

то, контрол система обнаруживает НОРМАЛЬНО! А если написать к нему обращение в виде предыдущего кода, то система разводит руками и говорит, что не знает, чего я от неё хочу. Похоже, она женского пола...

Словом, я лучше придумаю какой-то другой костыль, но я не хочу больше тратить на эту ерунду время. В любой случае, спасибо Вам за помощь!

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