1. 程式人生 > 實用技巧 >cxGrid自動儲存當前單元格輸入的資料

cxGrid自動儲存當前單元格輸入的資料

遇到的問題,利用cxGrid做資料錄入介面,當用戶在一個單元格中錄入資料,沒有回車,然後直接點工具條上的儲存按鈕,執行資料提交,結果當前輸入的內容丟掉了,又回到輸入前的值。

在群中求助,得到好多朋友的支援,這裡先感謝了,最終明白大家的說法,併成功解決掉了這個問題。

在這種情況下,與cxGrid的實現機制有關係,也就是說,點選工具條上的按鈕,沒有發生焦點變換,這時候cxGrid認為自己的使用者沒有輸入完成,繼續等使用者輸入。

理解了這種情況,有一種解決方法,就是在點儲存按鈕時,強制呼叫Self.SetFocus,這裡Self指Form;另外一種解決方法,就是呼叫cxGrid提供方法,強制提交資料。

看下面的程式碼,按大家的提法,有很多寫法:

procedure Tsys_AddressBTDoc.UpdateData(aTableView: TcxGridDBTableView);
var
  AValue:Variant;
begin
  if aTableView.DataController.IsEditing then
  begin
    //這是一種方法
    //AValue:=TcxCustomTextEdit(aTableView.DataController.Controller.EditingController.Edit).Text;
    //aTableView.dataController.DataSet.Edit;
//aTableView.dataController.DataSet.FieldByName('fname').AsString:=AValue; //aTableView.dataController.DataSet.Post; //這是一種方法 //aTableView.Controller.EditingController.HideEdit(True); //這是一種方法 //aTableView.Controller.EditingController.Edit.PostEditValue; //這是一種方法 //aTableView.dataController.DataSet.Post;
//這是一種方法 aTableView.dataController.UpdateData; end; end;

引數是cxGrid的一個檢視。如下圖,指ShiTableView。

當點選儲存按鈕,執行這個方法,強制cxGrid提交資料。

UpdateData(ShiTableView);

寫出這樣的結果,看似簡單,我確用了好幾個小時,因為產生一種現象,就是使用者第一次輸入,執行上面的動作,資料得不到儲存,第二次及以後則正常。最後查明,原來我的ShiTableView還使用了事件:ShiTableViewFocusedRecordChanged

在這個事件上,我做了調入其他cxGrid需要的資料,正是這個事件造成第一次執行錯誤。用程式碼在執行UpdateData前去掉這個事件,執行後再恢復事件。最終的程式碼變成這樣:

procedure Tsys_AddressBTDoc.actSaveExecute(Sender: TObject);
begin

  DisableFocusedRecordChanged;
  try
     //Self.SetFocus;//這是一種強制儲存當前cxGrid輸入的內容的方法
     UpdateData(ShiTableView); //這是一種強制儲存當前cxGrid輸入的內容的方法
     Save;
  finally
     EnableFocusedRecordChanged;
  end;

end;

最終,還有一點要說明,SetFocus與UpdateData的區別:

如果用SetFocus,會使cxGrid沒有了焦點,使用者要繼續操作cxGrid,就需要mouse點選一下,讓cxGrid重新得到焦點,對於連續輸入來說,不方便。而UpdateData方法,要寫更多的程式碼,使得程式碼偶合增加,有利有憋,自己把握了!我最後用的UpdateData方法。

再一次感謝群友們的指導與幫助!