If calling setVisible(false) on the header container causes the layout to break, then maybe the header container should override the inherited implementation of setVisible so it does the right thing (setting height to 0)

A little more information on this workaround: if you're combining the display of the header row with the display of columns, you must do so in a particular order. The following code fails in non-webkit browsers (and causes various other weird follow-on rendering errors with dialogs, menus, and I guess floating components):

A side effect is that there seems to be multiple layout runs associated with each call to setVisible/setHeight. Is there a way to reduce this to a single layout run? (Putting my C#/XAML hat on, I want an ExtJS equivalent to SuspendLayout/ResumeLayout.)