private void TableStructureChangedEventHandler(object sender, ItemChangedEventArgs e)
        {
            ITableColumn column = e.ItemIndex >= 0 ? (ITableColumn)_table.Columns[e.ItemIndex] : null;

            switch (e.ChangeType)
            {
            case ItemChangeType.ItemAdded:
                _columnToPropertyMap[column] = new TableDataPropertyDescriptor(this, column);
                NotifyListChanged(new ListChangedEventArgs(ListChangedType.PropertyDescriptorAdded, -1));
                break;

            case ItemChangeType.ItemChanged:
                _columnToPropertyMap[column] = new TableDataPropertyDescriptor(this, column);
                NotifyListChanged(new ListChangedEventArgs(ListChangedType.PropertyDescriptorChanged, -1));
                break;

            case ItemChangeType.ItemRemoved:
                _columnToPropertyMap.Remove(column);
                NotifyListChanged(new ListChangedEventArgs(ListChangedType.PropertyDescriptorDeleted, -1));
                break;

            case ItemChangeType.ItemInserted:
            case ItemChangeType.Reset:
                _columnToPropertyMap.Clear();
                NotifyListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
                break;
            }
        }
        public TableAdapter(ITable table)
        {
            _table = table;
            _table.Items.ItemsChanged   += TableDataChangedEventHandler;
            _table.Columns.ItemsChanged += TableStructureChangedEventHandler;

            // init map of columns to property descriptors
            _columnToPropertyMap = new Dictionary <ITableColumn, TableDataPropertyDescriptor>();
            foreach (ITableColumn column in _table.Columns)
            {
                _columnToPropertyMap[column] = new TableDataPropertyDescriptor(this, column);
            }
        }