             const columns:IList = columns;
             return (columns) ? columns.length : 0;
         }
+        
+        /**
+         *  @private
+         */
+        private function generateColumns():IList
+        {
+            var item:Object = typicalItem;
+            if (!item && dataProvider && (dataProvider.length > 0))
+                item = dataProvider[0];
+            
+            var itemColumns:IList = null;
+            if (item)
+            {
+                itemColumns = new ArrayList();
+                for (var property:String in item)
+                {
+                    var column:GridColumn = new GridColumn();
+                    column.dataField = property;
+                    itemColumns.addItem(column);
+                } 
+            }
+            
+            return itemColumns;
+        }
+       
         
         //----------------------------------
         //  dataProvider

         */
        public function get columns():IList
        {
            return _columns;
        }
        

            // addEventListener parameter) is safe, since the listener's lifetime is the 
            // same as this object.        
            
            const newColumns:IList = _columns;
            if (newColumns)
            {
                newColumns.addEventListener(CollectionEvent.COLLECTION_CHANGE, columns_collectionChangeHandler, false, 0, true);            
