Люди, 3-й раз пытаюсь решить этот вопрос.
на
мсдн есть пример как реализовывать этот интерфейс, но там он реализован как объект содержащий ОДНУ коллекцию(таблицу)
в книге Брайан Нойес "Привязка данных в Windows Forms" говорится:
Код привязки данных может использовать реализацию интерфейса IListSource объекта для получения списка для привязки, когда сам источник данных списком не является(1), или для получения списка коллекций, которые содержит объект(2).
Так вот на мсдн успешно продемонстрирован первый вариант. и нигде не могу найти пример реализации второго варианта.
По аналогии с DataSet: DataSet содержит коллекцию DataTable. когда в окне DataSources видим DataSet, то можно увидеть так-же его таблицы.
Вот код иллюстрирующий проблему:
using System.Collections;
using System.ComponentModel;
namespace ListSourceQuestion
{
public class ProdTypeList : BindingList<ProdType> { }
public class ProdType
{
public string ProdTypeName { get; set; }
public ProdType() { this.ProdTypeName = "new prod type"; }
}
public class ProductList : BindingList<Prodcut> { }
public class Prodcut
{
public string ProdName { get; set; }
public Prodcut() { this.ProdName = "new product"; }
}
// контейнер данных (датасет)
public class MyDataContainer : Component , IListSource
{
// коллекция(таблица) типов товаров
private ProdTypeList _prodTypes = new ProdTypeList();
public ProdTypeList ProdTypes { get { return this._prodTypes; } }
// коллекция(таблица) товаров
private ProductList _products = new ProductList();
public ProductList Products { get { return this._products; } }
public MyDataContainer() { }
public MyDataContainer(IContainer container)
{
container.Add(this);
}
// вариант 1 - работает
// реализация предусматривающая вывод таблицы "по умолчанию"
/*
#region IListSource Members
bool IListSource.ContainsListCollection
{
get { return false; } // нет мой объект НЕ ЯВЛЯЕТСЯ является коллекцией коллекций
}
IList IListSource.GetList()
{
return this.Products;
}
#endregion
*/
// вариант 2 - не работает.......
// реализация предусматривающая вывод "списка таблиц";
#region IListSource Members
bool IListSource.ContainsListCollection
{
get { return true; } // да мой объект ЯВЛЯЕТСЯ коллекцией коллекций
}
IList IListSource.GetList()
{
IList retVal;
ArrayList lst = new ArrayList();
lst.Add(this.ProdTypes);
lst.Add(this.Products);
retVal = lst as IList;
// что тут возвращать, чтоб в окне источников данных он показывал как датасет - список таблиц?
return retVal;
}
#endregion
}
}
Убедительная просьба не посылать меня куда подальше...... набродился уже. просто допишите код.
С Уважением. Ашот.