'Kettenreaktion' trifft den Nagel auf den Kopf.
Delphi-Quellcode:
Procedure TMyForm.InitializeData;
Begin
MyProductGridView.OnRecordChanged := Nil;
Try
LoadDataFromDatabase();
..
Finally
MyProductGridView.OnRecordChanged := MyProductGridViewRecordChangedEvent;
End
End;
So in etwa. Natürlich alle relevanten Events vorher per ':= Nil' aushängen und hinterher wieder einhängen.
Eine Alternative ist die Verwendung eines privaten boolschen Feldes 'fInitializing'.
Delphi-Quellcode:
Procedure TMyForm.InitializeData;
Begin
fInitializing := True;
Try
LoadDataFromDatabase();
..
Finally
fInitializing := False;
End
End;
und in jedem Eventhandler
Delphi-Quellcode:
Procedure TMyForm.MyProductGridViewRecordChanged(...);
Begin
if fInitializing then exit; // <-- diese Zeile am Anfang jedes Eventhandlers
...
End;
Beides hat Vor- und Nachteile. Ich tendiere zur 2.Möglichkeit, weil ich dadurch generell steuern kann, wann meine Events feuern sollen.
Falls die Daten schon geladen sind und dein Problem beim instantiieren der Form auftritt, dann würde ich so vorgehen
Delphi-Quellcode:
Procedure TMyForm.FormCreate(...)
Begin
MyGridView.DataBinding.DataSource := Nil;
End;
Procedure TMyForm.FormActivate(...)
Begin
MyProductGridView.OnRecordChanged := Nil;
Try
MyGridView.DataBinding.DataSource := MyDataSource;
Finally
MyProductGridView.OnRecordChanged := MyProductGridViewRecordChangedEvent;
End
End;