就像我在評論中所說的,標準TDataset
的行爲是調用其.Post
方法在導航到另一行之前保存對當前行的更改。這發生在例程TDataSet.CheckBrowseMode
的Data.DB.Pas
中,在任何導航操作之前調用該例程。如果不派生自定義的TDataset
後代,這是不能改變的。
(從Data.DB.Pas)
procedure TDataSet.CheckBrowseMode;
begin
CheckActive;
DataEvent(deCheckBrowseMode, 0);
case State of
dsEdit, dsInsert:
begin
UpdateRecord;
if Modified then Post else Cancel;
end;
dsSetKey:
Post;
end;
end;
當然,一個TDataSet
有BeforePost
事件,所以它可能是很有誘惑力的嘗試,並用它來取消更改;然而,BeforePost
的問題是如何確定被調用的上下文,以便能夠判斷是否從CheckBrowseMode
調用它,而不是用戶單擊保存按鈕的結果。
圍繞着簡單的方式是趕BeforeAction
事件您DBNavigator
的,它會調用數據集上的導航作用,這將觸發.Post
前:
procedure TForm1.DBNavigator1BeforeAction(Sender: TObject; Button:
TNavigateBtn);
var
Res : Integer;
DataSet : TDataSet;
begin
DataSet := DBNavigator1.DataSource.DataSet;
case Button of
nbFirst,
nbPrior,
nbNext,
nbLast: begin
if DataSet.State in [dsEdit, dsInsert] then begin
Res := MessageDlg('The current row has unsaved changes. Abandon them?', mtWarning, [mbYes, mbNo], 0);
if Res = mrYes then
DataSet.Cancel
else
DataSet.Post;
end;
end;
end;
end;
默認情況下,德爾福TDataSets移動之前發佈到當前行的任何變化數據集光標移動到另一行,如.Next或.Prior。標準的TDBNavigator Post按鈕只能調用DataSet.Post,並且不會自己提交對後端數據庫的更改。你想在數據集滾動之前推遲提交更改或取消更改?換句話說,當用戶從未保存/未提交更改的行中滾動時,您希望應用程序如何響應? – MartynA
感謝MartynA。當用戶滾動到下一個/之前的數據時,我想丟棄未保存/未完成的更改。我只想在用戶按下綠色勾號時保存它們。 – Tommy