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方法。

這是最后完成的界面:

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM