дерево классов как DataSource
От: EvgenB Украина  
Дата: 05.09.07 14:23
Оценка:
Доброго времени суток!
Есть древовидная структура: один или несколько сурсов из которых берутся данные, к каждому сурсу необходимо добавить несколько дестинейшонов, которые в свою очередь могут иметь только одну форигновую таблицу.

* Source_1
   -> Destination_1
   -> Destination_2
          -> Foreign_1
   -> Destination_3
     ...
* Source_n
   -> Destination_v
          -> Foreign_k
   -> Destination_ v+1


Проблема состоит в том, чтобы дерево классов было одновременно еще и DataSource для XtraTreeList (DevExpress) или DataGid’a.
А вопрос собсно: какие и как реализовать интерфейсы IList, IListSource, IBindingList... или что другое, дабы дерево строясь не в плоском виде (аля DataTable) а в виде дерева было само по себе DataSource.
Долго искал по гуглям и яндексам примеры реализации нелинейных данных при помощи IList, IListSource, IBindingList, так и не нашел или не увидел 
Вот что пробовал (часть кода откуда-то была содрана):

// базовый класс, который используется в списке и содержит отображаемые поля записи
    abstract public class ACmyitem
    {
        public ACmyitem()
        { m_i = -1; }

        public ACmyitem(int p)
        { m_i = p; }

        int m_i;
        public int prop
        {
            get { return m_i; }
            set { m_i = value; }
        }
    }

// класс, который используется в списке и содержит отображаемые поля записи
    public class myitem : ACmyitem
    {
        public myitem(int i) : base(i) {}
    }

// непосредственно, как планировалось noda дерева, которая реализует и ветвь 
// дерева (IListSource) и лист его (ACmyitem)
    public class MyDS: ACmyitem, IListSource 
    {
        private ArrayList al = null;

        public void SetList()
        {
            al = new ArrayList();
            myitem item;
            for (int i = 0; i < 5; i++)
            {
                item = new myitem(i);
                al.Add(item);
            }
        }

        public void AddItem(MyDS ds)
        {
            if (al == null) {al = new ArrayList();}
            al.Add(ds);
        }

        public void AddItem(myitem item)
        {
            MyDS ds = new MyDS();
            ds.prop = item.prop;
            if (al == null) { al = new ArrayList(); }
            al.Add(ds);
        }

        public void SetItem()
        { prop = 99; }

        #region IListSource Members 
        public IList GetList() 
        { return al; }

        public bool ContainsListCollection 
        {
            get { return (al != null); }
        } 

        #endregion 
    }


А вот таким макаром я привязывал это все ака датасурс:


            MyDS ROOTmyds = new MyDS();
            MyDS item = new MyDS();
            item.SetList();
            ROOTmyds.AddItem(item);
            item = new MyDS();
            ROOTmyds.AddItem(item);
            item.SetList();
            item = new MyDS();
            ROOTmyds.AddItem(item);

            treeList1.DataSource = ROOTmyds;
            treeList1.PopulateColumns();
            gridControl1.DataSource = ROOTmyds;


в результате ArrayList al, что лежит в ROOTmyds, благополучно отображается, однако все, что лежит внутри объектов al[0], … al[n] никак не хтит.

Заранее сенкс всем!
с уважением, Евген.


06.09.07 12:46: Перенесено модератором из '.NET' — AndrewVK
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.