Отключить строку в cxgrid
Я хочу строку в cxgrid, где UserRights = 3 отключена.
Я попробовал это предложение, но оно, похоже, не работает:
// MAKING A ROW READ ONLY
procedure TForm1.cxGrid1DBTableView1InitEdit(
Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem;
AEdit: TcxCustomEdit);
var
AKeyValue : Variant;
begin
AKeyValue := Sender.DataController.GetRecordId(Sender.Controller.FocusedRecordIndex);
if (AKeyValue = '3') then
AEdit.ActiveProperties.ReadOnly := True;
end;
Я хочу, чтобы пользователь мог редактировать данные, но не там, где UserRights=3.
Я также попытался заблокировать напрямую:
procedure TData_Module.USERSBeforePost(DataSet: TDataSet);
begin
if main_form.dxStatusBar1.Panels[0].Text = '3' then
Users.Post
else
showmessage('Access denied.');
abort;
end;
Это работает нормально, пока main_form.dxStatusBar1.Panels[3].Текст не равен 3. Если это 3, и я пытаюсь изменить любую запись, я завершаю работу программы. Я думал, что блокировка строки от редактирования - лучшая идея, но она, похоже, не работает. Есть идеи?
2 ответа
Обновление Код в событии EditInit включает проблемы, описанные ниже. Следующий метод позволяет избежать этих проблем:
procedure TForm1.cxGrid1DBTableView1Editing(Sender: TcxCustomGridTableView;
AItem: TcxCustomGridTableItem; var AAllow: Boolean);
var
AKeyValue : Variant;
ADataSet : TDataset;
begin
ADataSet := cxGrid1DBTableView1.DataController.DataSource.DataSet;
AKeyValue := ADataSet.FieldByName('ID').AsInteger; // or 'UserRights'
if AKeyValue = '3' then
AAllow := False;
end;
Обратите внимание, что вы должны использовать приведенный выше код вместо кода EditInit, а не так, как он.
Оригинальная версия ответа:
Ответ, который вам дал пользователь763539, правильный, поэтому +1 за это; если вы не установите DataFontroller's KeyFieldNames в поле, значение которого вы хотите проверить, AKeyValue
возвращает Null
Тем не менее, просто установив ReadOnly в значение true, в графическом интерфейсе пользователя возникает эффект, который пользователь может счесть недружелюбным / запутанным, а именно то, что при нажатии в ячейке строки, которая является ReadOnly, тем не менее значение в ячейке по-прежнему отображается как выбранное, давая Такое впечатление, что вы можете редактировать его, пока не попробуете. Чтобы избежать этого, измените ваш обработчик InitEdit, как показано ниже - вызов Abort не позволяет отображать выбранное значение ячейки.
procedure TForm1.cxGrid1DBTableView1InitEdit(Sender: TcxCustomGridTableView;
AItem: TcxCustomGridTableItem; AEdit: TcxCustomEdit);
var
AKeyValue : Variant;
begin
AKeyValue := Sender.DataController.GetRecordId(Sender.Controller.FocusedRecordIndex);
if (AKeyValue = '3') then begin
AEdit.ActiveProperties.ReadOnly := True;
Abort;
end;
end;
Предупреждение: Кажется, в версии 15 есть причуды, по крайней мере, для cxGrid, который раскрывается при использовании события InitEdit таким образом. У меня есть поле "Имя", содержимое которого просто 'Name ' + IntToStr(ID)
где ID - мой эквивалент пользовательских прав ОП. Следующее показывает эту причуду:
- Щелкните в любой строке данных, кроме ID/UserRights = 3.
- Нажмите в 3 ряду;
- Теперь щелкните заголовок столбца Имя.
После шага 3 в ячейке Имя в строке ID/UserRights = 3 отображается значение строки, выбранной на шаге 1. Эту проблему не избежать, установив для GridMode значение True. Кажется, это проблема, которая влияет только на отображение поля, а не на содержимое данных поля. Я назвал это "причудой", а не ошибкой, потому что я не уверен, что дизайнеры cxGrid когда-либо намеревались Abort
быть вызванным внутри события InitEdit.
Вам нужно установить
DataController в GridView.KeyFieldNames
на ваше имя поля.