Отключить строку в 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 - мой эквивалент пользовательских прав ОП. Следующее показывает эту причуду:

  1. Щелкните в любой строке данных, кроме ID/UserRights = 3.
  2. Нажмите в 3 ряду;
  3. Теперь щелкните заголовок столбца Имя.

После шага 3 в ячейке Имя в строке ID/UserRights = 3 отображается значение строки, выбранной на шаге 1. Эту проблему не избежать, установив для GridMode значение True. Кажется, это проблема, которая влияет только на отображение поля, а не на содержимое данных поля. Я назвал это "причудой", а не ошибкой, потому что я не уверен, что дизайнеры cxGrid когда-либо намеревались Abortбыть вызванным внутри события InitEdit.

Вам нужно установить

DataController в GridView.KeyFieldNames

на ваше имя поля.

Другие вопросы по тегам