Доброго времени суток!
Есть древовидная структура: один или несколько сурсов из которых берутся данные, к каждому сурсу необходимо добавить несколько дестинейшонов, которые в свою очередь могут иметь только одну форигновую таблицу.
* 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