我想在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并且我尝试修改任何记录我崩溃了程序。 我认为阻止行被编辑是一个更好的主意,但它似乎不起作用。有什么想法吗?
答案 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。以下显示了这个怪癖:
在步骤3之后,ID / UserRights = 3行中的Name单元格显示在步骤1中单击的行的值。通过将GridMode设置为True,不会避免此问题。这似乎只是影响字段显示的问题,而不是字段的数据内容。我称之为“怪癖”。而不是一个错误,因为我不确定cxGrid的设计师是否曾打算在InitEdit事件中调用Abort
。
答案 1 :(得分:1)
您需要设置
GridView的DataController.KeyFieldNames
到你的fieldname。