Обновление Код в событии 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 за это; если вы не установите KeyFieldNames DataController в поле, значение которого вы хотите проверить, AKeyValue
возвращает Null.
Однако просто установка значения 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;
Предупреждение: кажется, что в v.15 есть причуда, по крайней мере, в cxGrid, которая выставляется с использованием события InitEdit таким образом. У меня есть поле «Имя», содержимое которого просто 'Name ' + IntToStr(ID)
, где ID — это мой эквивалент прав пользователя OP. Следующее показывает эту причуду:
- Щелкните в любой строке данных, отличной от ID/UserRights = 3.
- Щелкните в строке 3;
- Теперь щелкните заголовок столбца Имя.
После шага 3 в ячейке Имя в строке ID/UserRights = 3 отображается значение строки, выбранной на шаге 1. Эту проблему нельзя избежать, задав для GridMode значение True. Кажется, это проблема, которая влияет только на отображение поля, а не на содержимое данных поля. Я назвал это «причудой», а не ошибкой, потому что я не уверен, что разработчики cxGrid когда-либо предполагали, что Abort
будет вызываться внутри события InitEdit.
person
MartynA
schedule
07.11.2016
UserRights
. - person Tom Brunberg   schedule 07.11.2016...Panels[0].Text
действительно отражаетUserRights
, у вас неправильная логика, возможно, вам следует использовать<> '3'
. Кроме того, я думаю, что вы пропустили паруbegin end
вокруг двух строк послеelse
. - person Tom Brunberg   schedule 07.11.2016