void AddColumnsFromSource (PagedDataSource data_source) { PropertyDescriptorCollection props = null; Type ptype = null; bool no_items = false; // Use plain reflection for the Item property. // If we use TypeDescriptor, props will hold // all of the Type properties, which will be listed as columns Type ds_type = data_source.GetType (); PropertyInfo pinfo = ds_type.GetProperty ("Item", item_args); if (pinfo == null) { IEnumerator items = (data_source.DataSource != null) ? data_source.GetEnumerator () : null; if (items != null && items.MoveNext ()) { object data = items.Current; if ((data is ICustomTypeDescriptor) || (!IsBindableType(data.GetType()))) props = TypeDescriptor.GetProperties (data); else if (data != null) ptype = data.GetType (); data_enumerator = items; } else { no_items = true; } } else { ptype = pinfo.PropertyType; } if (ptype != null) { // Found the "Item" property AddPropertyToColumns (); } else if (props != null) { foreach (PropertyDescriptor pd in props) AddPropertyToColumns (pd, false); } else if (!no_items) { // This is not thrown for an empty ArrayList. string msg = String.Format ("DataGrid '{0}' cannot autogenerate " + "columns from the given datasource. {1}", ID, ptype); throw new HttpException (msg); } }