Добрый день!
Подскажите пожалуйста как лучше запретить пользователю редактирование данных на форме.
Пока я сделал следующим образом:
в событии onPrepare формы
wnd_BaseDBEditOnPrepare(Window);
if (dlData.Dataset.IsActive) {
if (dlData.Dataset.State == dstEdit) {
if (dlData.Dataset('HasRight') != 1) {
SwitchControlForm(Window,false);}
else {SwitchControlForm(Window,true);}
}
}
function SwitchControlForm(Window,Enable) {
for (var i = 0; i Window.ComponentCount; i++) {
var DataField = Window.Components(i).DataField;
if((!IsUndefined(DataField)) || (Window.Components(i).Name == 'btnOK')) {
Window.Components(i).IsEnabled = Enable;
/*if (Window.Components(i).Name == 'btnOK') {
Window.Components(i).IsEnabled = Enable;}
else
{DataField.IsReadOnly = !Enable;}*/
}
}
}
Но смущает что при открытии формы происходит явное мигание, т.е. вероятнее всего сначала отрисовывается форма с закрытыми на редактирование контролами, потом открываются контролы по доступу, а уже потом я их вновь закрываю. Причем, что Window.Components(i).IsEnabled = Enable; что DataField.IsReadOnly = !Enable это явно видно. Такое ощущение что можно сделать и по другому.
Нравится
Александр, а если использовать функции
Window.BeginUpdate();
и
Window.EndUpdate();
Первую до начала перерисовки, вторую — после. Можно даже попробовать первую до вызова wnd_BaseDBEditOnPrepare, но не уверен, что заработает без ошибок.
Включить администрирование на таблице, в настройках администрирования запретить редактировать.
У Components есть Components на сколько помню. Нужно вызывать рекурсивную функцию, проныривающую на всю глубину. Впрочем если верхний эллемент заблокирован наверное и все остальное заблокируеться.
Александр, если приведенные выше рекомендации не помогут - обращайтесь.
Хорошего вечера!
Александр, использование Window.BeginUpdate(); практически не помог, я во всяком случае на глаз разницы не заметил.
Борис, включить администрирование по записям в данном случае не вариант, т.к. идет логическая проверка на основании неких условий, имеет или нет пользователь доступ к данной записи.
Коллеги, а где вообще происходит проверка и закрытие формы по доступу? Я рылся, по wnd_BaseDBEdit, но так и не нашел.
Не вижу смысла все ставить в readonly. Может просто блокировать всю форму?
Не знаю, как у вас там называются, например, у контрагентов будет так:
function SwitchControlForm(Window,Enable) { frmMain.IsEnabled = Enable; btnOK.IsEnabled = Enable; }
Александр, да я пробовал у формы подергать свойство IsEnabled, но оно почему-то не работает, т.е форма не закрывается и вообще ничего не происходит
function wnd_MP_KredEditOnPrepare(Window) {
wnd_BaseDBEditOnPrepare(Window);
wnd_MP_KredEdit.IsEnabled = false;
}
"Крупский Александр" написал:Александр, да я пробовал у формы подергать свойство IsEnabled, но оно почему-то не работает, т.е форма не закрывается и вообще ничего не происходит
function wnd_MP_KredEditOnPrepare(Window) {
wnd_BaseDBEditOnPrepare(Window);
wnd_MP_KredEdit.IsEnabled = false;
}
Сталиквался с тем, что есть есть код который передергивает это свойство для всех эллементов(скорей всего механизм администрирования). Так что xxxxxx.IsEnabled = false; писал в событие Show и все работало, а вот в Prepare ничего не работало.
Не понял, вы пытаетесь все окно закрыть?
У нас есть окно, в нем область данных и область кнопок, в области данных, есть страницы, в страницах есть форма. Вот ее уже надо блокировать. Ну если я не так вас понял, извините. Но от моргания думаю все равно не уйти.
Все равно этот IsEnabled не функционирует, ни на форме, ни на фрайме, ни в OnPrepare, ни в OnShow ((
function wnd_MP_KredEditOnShow(Window) {
wnd_BaseDBEditOnShow(Window)
frmData.IsEnabled = false;
wnd_MP_KredEdit.IsEnabled = false;
}
Каким то ведь образом происходит закрытие формы при отсутствии доступа. Мне бы посмотреть на этот механизм, вот только найти его не могу.
"Крупский Александр" написал:Все равно этот IsEnabled не функционирует, ни на форме, ни на фрайме, ни в OnPrepare, ни в OnShow ((
function wnd_MP_KredEditOnShow(Window) {
wnd_BaseDBEditOnShow(Window)
frmData.IsEnabled = false;
wnd_MP_KredEdit.IsEnabled = false;
}
function wnd_IncidentEditOnShow(Window) {
if (Pages.ActivePage != pgIncident) {
Pages.ActivePage = pgIncident;
}
debugger;
wnd_IncidentEdit.IsEnabled=false;
}
wnd_IncidentEdit - отлично блокируется, кнопки Ок, Отмена становятся неактивными. Может после события OnShow у вас еще что то выполняйтся? (сборка 3.4.0)
Нет, больше ничего не выполняется. Сборка (3.3.2)
Еще одна странность, поставил я дебаг посмотреть ставиться ли это свойство и к моему изумлению в событии OnShow оно уже стоит в false. Дерганье данного свойства тоже не помогает. На тестовой базе попробовал сделать это с инцидентами, как показано выше. Результат тот же, т.е. никакого ))
"Крупский Александр" написал:Нет, больше ничего не выполняется. Сборка (3.3.2)
Еще одна странность, поставил я дебаг посмотреть ставиться ли это свойство и к моему изумлению в событии OnShow оно уже стоит в false. Дерганье данного свойства тоже не помогает. На тестовой базе попробовал сделать это с инцидентами, как показано выше. Результат тот же, т.е. никакого ))
Значит, что то не так в начальном коде. Обновляйтесь или отсылайте дамп тестовой базы на припарирование. У меня например есть scr_SelectDataWithGroupUtils.xml трех версий от 3.4.0, код везде разный, последняя версия работает отлично, самая старая почти не работает.
Александр, направьте, пожалуйста, в Службу технической поддержки резервную копию БД для рассмотрения проблемы.