Использование событий DataSet для синхронизации пользовательского интерфейса не является хорошей практикой. Для этого вы можете полагаться на события источника данных, отделяя логику пользовательского интерфейса от бизнес-логики.
Поскольку состояние DataSet изменится с dsInactive на dsBrowse, вы можете положиться на изменение DataSource OnState, чтобы сделать что-либо связанное с пользовательским интерфейсом после загрузки данных из базы данных.
Вы можете положиться на поле Auxiliar для отслеживания предыдущего состояния, чтобы избежать выполнения кода больше, чем нужно.
например (непроверенный код)
procedure TForm1.DataSource1StateChange(Sender: TObject);
begin
if (DataSource1.State = dsBrowse) and (not FUIStateInSync) then
begin
//dataset is open, change UI accordingly
DBGrid1.Columns[0].Visible := SomeCondition();
//this will prevent the code to be executed again
//as state comes to dsBrowse after posting changes, etc.
FUIStateInSync := True;
end
else if (DataSource1.State = dsInactive) then
FUIStateInSync := False; //to let it happen again when opened.
end;
Я публикую это, даже когда у вас есть принятый ответ, потому что О.Д. предложение - это то, чего вам следует избегать.