遇到的問題,利用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方法。
這是最后完成的界面:
再一次感謝群友們的指導與幫助!