The following code in GridCtrl.cpp tells us why reason==OPEN is so special as Init() is called within and everything is guaranteed to work well before further changes. Unfortunately Init() and the most or all the method it calls are private, so RemoveCtrl() and Add() is indeed the best thing we can do for now.
void GridCtrl::Init()
{
bar.Set(WhenToolBar);
UpdateCols(true);
/* recalc_rows bo przed otworzeniem grida moglo zostac wywolane setrowheight */
UpdateRows(resize_row_mode > 0 || recalc_rows);
UpdateSizes();
UpdateSb();
UpdateHolder(true);
SyncSummary();
SyncCtrls();
}
void GridCtrl::State(int reason)
{
if(reason == OPEN)
{
Init();
ready = true;
//ready po init - updatesb wola layout() a ten syncctrl
//(ktory w sumie wola sie 3 razy zanim grid sie wyswietli - niepotrzebnie)
}