2016-11-07 73 views
0

我想在cxgrid中禁用UserRights = 3的行。禁用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]。文本是 3. 如果是3工作確定,我嘗試和修改任何記錄我崩潰的程序。 我認爲阻止行被編輯是一個更好的主意,但它似乎並沒有工作。有任何想法嗎 ?

+0

我對數據庫知之甚少,但在第一次嘗試時,您似乎要求記錄ID,而不是名爲「UserRights」的字段的值。 –

+0

在第二次嘗試中,如果'... Panels [0] .Text'確實反映了UserRights,那麼您的邏輯錯誤,也許應該使用'<>'3'。另外,我想你在'else'之後的兩行附近錯過了一個'begin end'對。 –

回答

1

您需要設置

GridView的DataController.KeyFieldNames

你的字段名。

2

更新 EditInit事件中的代碼涉及下面描述的問題。下面的方法可以避免這些問題:請注意,您應該使用上面的代碼而不是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; 

警告:好像有至少cxGrid在第15節怪癖這是由以這種方式使用的InitEdit事件曝光。我有一個字段'名稱',其內容只是'Name ' + IntToStr(ID)其中ID是我的等同於OP的UserRights。下面顯示了本怪癖:

  1. 單擊任何數據行比的ID/UserRights = 3一個其他。
  2. 點擊3行;
  3. 現在單擊名稱列標題。

在步驟3之後,ID/UserRights = 3行中的名稱單元顯示在步驟1中單擊的行的值。將GridMode設置爲True不會避免此問題。這似乎是一個隻影響字段顯示的問題,而不是字段的數據內容。我稱它爲「怪癖」而不是bug,因爲我不確定cxGrid的設計人員曾經打算在InitEdit事件中調用Abort

+0

但是,如果我對cxgrid中的記錄進行排序(單擊列標題),那麼以前鎖定的行突然變爲可編輯。這是一個錯誤? – user3351050

+0

看來我必須使用'網格模式'才能正常工作。 :( – user3351050