在cxgrid中禁用一行

时间:2016-11-07 02:42:07

标签: delphi devexpress tcxgrid

我想在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] .Text 3,就可以正常工作。 如果它是3并且我尝试修改任何记录我崩溃了程序。 我认为阻止行被编辑是一个更好的主意,但它似乎不起作用。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

更新 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为此;如果您没有将DataController的KeyFieldNames设置为您要测试其值的字段,AKeyValue将返回Null。

然而,仅将ReadOnly设置为true会在GUI中产生一种效果,即用户可能会发现不友好/混乱,即当您单击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中似乎有一个怪癖至少是以这种方式使用InitEdit事件暴露的cxGrid。我有一个字段'姓名'其内容只是'Name ' + IntToStr(ID),其中ID等同于OP的UserRights。以下显示了这个怪癖:

  1. 点击任何数据行 ID / UserRights = 3。
  2. 点击第3行;
  3. 现在点击名称列标题。
  4. 在步骤3之后,ID / UserRights = 3行中的Name单元格显示在步骤1中单击的行的值。通过将GridMode设置为True,不会避免此问题。这似乎只是影响字段显示的问题,而不是字段的数据内容。我称之为“怪癖”。而不是一个错误,因为我不确定cxGrid的设计师是否曾打算在InitEdit事件中调用Abort

答案 1 :(得分:1)

您需要设置

  

GridView的DataController.KeyFieldNames

到你的fieldname。