public ArrayList GetSortedBindProperties()
 {
     ArrayList bindProp = new ArrayList();
     IComparer bindOrderComparer = new TreeListObjectsOrderComparer(this);
     Type t = this.GetType();
     PropertyInfo[] props = t.GetProperties(BindingFlags.Public | BindingFlags.Instance);
     ClassifyProperty(props, null, bindProp);
     bindProp.Sort(bindOrderComparer);
     return bindProp;
 }
            // bindAll = true => bind all property except "Items" event <TreeListObjects> has no child items
            public int FillDataTable(DataTable table, Hashtable values, bool bindAll)
            {
                this.RowSpan = 0;
                Type t = this.GetType();
                ArrayList fieldProp = new ArrayList(), bindProp = new ArrayList();

                // Classify Property and sort binding property by "BindOrder"
                IComparer bindOrderComparer = new TreeListObjectsOrderComparer(this);
                PropertyInfo[] props = t.GetProperties(BindingFlags.Public | BindingFlags.Instance);
                ClassifyProperty(props, fieldProp, bindProp);
                bindProp.Sort(bindOrderComparer);

                // get current level values from fields property
                if (values == null) values = new Hashtable();
                foreach (PropertyInfo prop in fieldProp)
                {
                    if (table.Columns.Contains(prop.Name))
                    {
                        values[prop.Name] = prop.GetValue(this, null);
                    }
                }

                // get child level values from binds property
                if (bindProp.Count > 0)
                    foreach (PropertyInfo prop in bindProp)
                    {
                        TreeListObjects objs = (TreeListObjects)prop.GetValue(this, null);
                        if (objs != null) { this.RowSpan += objs.FillDataTable(table, values, bindAll); }
                    }
                // leaf ==> create and add row
                else
                {
                    DataRow row = table.NewRow();
                    foreach (DictionaryEntry val in values) { row[val.Key.ToString()] = val.Value; }
                    table.Rows.Add(row);
                    this.RowSpan = 1;
                }

                // clear current level values
                foreach (PropertyInfo prop in fieldProp)
                {
                    if (values.Contains(prop.Name)) values.Remove(prop.Name);
                }

                // after all return row span for this object level
                return this.RowSpan;
            }