             gridLayout.dataProviderCollectionChanged(event);
         
         if (gridSelection)
-            gridSelection.dataProviderCollectionChanged(event);
-            
-        // ToDo:  do we need to do any scrolling to keep either the hover
-        // indicator or the caret indicator visible?
+            gridSelection.dataProviderCollectionChanged(event);            
+        
+        if (gridDimensions && hoverRowIndex != -1)
+            updateHoverForDataProviderChange(event);
+        
+        // The data has changed so need to do this here so the grid dimensions
+        // will be accurate if setting the caret requires scrolling.
+        invalidateSize();
+        invalidateDisplayList();
         
         if (caretRowIndex != -1)
             updateCaretForDataProviderChange(event);
-        
-        if (gridDimensions && hoverRowIndex != -1)
-            updateHoverForDataProviderChange(event);    
-
-        invalidateSize();
-        invalidateDisplayList();
+
     }
     
     /**

        const oldCaretColumnIndex:int = caretColumnIndex;
        const location:int = event.location;
        var itemsLength:int;
        
        // this should stay in sync with updateCaretForDataProviderChange
        
        switch (event.kind)
        {

    
    /**
     *  @private
     *  Cache the dataItem that goes with the caretRowIndex so we can find the
     *  rowIndex of the caret after a collection refresh event.
     */    
    private var caretSelectedItem:Object = null;
    
    /**
     *  @private
     *  True while updateDisplayList is running.  Use to disable invalidateSize(),
     *  invalidateDisplayList() here and in the GridLayer class.
     */
