2016-11-07 2 views
0

UserRights = 3이 비활성화 된 행을 cxgrid에서 원합니다. cxgrid에서 행 사용 안 함

나는이 제안을 시도했지만 작동하지 않는 것 :

// 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

DB에 대해 많이 알지는 못하지만, 첫 번째 시도에서는 'UserRights'라는 필드의 값이 아니라 레코드 ID를 요청하는 것 같습니다. –

+0

두 번째 시도에서'... Panels [0] .Text'는 실제로 논리가 틀린'UserRights'를 반영합니다. 아마도'<> '3'을 사용해야합니다. 또한,'else' 뒤에 두 줄을 중심으로'begin end' 쌍을 놓친 것 같습니다. –

답변

1

당신은 당신의 필드 이름에

의 GridView의 DataController.KeyFieldNames

를 설정해야합니다.

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 코드 대신 사용할 수 있습니다.

대답

원래 버전 :

당신이 user763539에 의해 부여 된 대답은 그래서, +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; 

경고 :이 방법으로 InitEdit 이벤트를 사용하여 노출되는 cxGrid의 적어도 15 절에있는 특질이있는 것 같습니다. 나는 누구의 내용이 단순히 'Name ' + IntToStr(ID) 인 필드 'Name'을 가지고 있는데, 여기서 ID는 OP의 UserRights에 해당합니다. 다음 프로그램이 특질 : ID가/UserRights = 3보다 다른 데이터 행

  1. 클릭.
  2. 3 행을 클릭하십시오.
  3. 이제 이름 열 머리글을 클릭하십시오.

ID/UserRights = 3 행의 이름 셀에 1 단계에서 클릭 한 행의 값이 표시됩니다.GridMode를 True로 설정하면이 문제를 피할 수 없습니다. 이것은 필드의 데이터 내용이 아닌 필드의 표시에만 영향을 미치는 문제인 것처럼 보입니다. 내가 cxGrid의 디자이너가 Abort을 InitEdit 이벤트 내에서 호출하도록 의도했는지 확신 할 수 없기 때문에 버그가 아니라 'quirk'라고 불렀습니다.

+0

그러나 cxgrid (열 머리글 클릭)에서 레코드를 정렬하면 갑자기 이전에 잠긴 행을 편집 할 수있게됩니다. 이거 버그 야? – user3351050

+0

제대로 작동하려면 '그리드 모드'를 사용해야합니다. :( – user3351050