Как реализовать IListSource в своем объекте?
От: karapetyan_ashot  
Дата: 29.08.09 21:00
Оценка:
Люди, 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
        
    }
}



Убедительная просьба не посылать меня куда подальше...... набродился уже. просто допишите код.

С Уважением. Ашот.
Re: Как реализовать IListSource в своем объекте?
От: _FRED_ Черногория
Дата: 31.08.09 07:27
Оценка:
Здравствуйте, karapetyan_ashot, Вы писали:

_>Люди, 3-й раз пытаюсь решить этот вопрос.


Позволю себе несколько коментариев. "В третий раз" означает, что тут есть уже пара похожих топиков? Надо было или поднять их, или привести на них ссылки в этом сообщении.

_>Так вот на мсдн успешно продемонстрирован первый вариант. и нигде не могу найти пример реализации второго варианта.

_>По аналогии с DataSet: DataSet содержит коллекцию DataTable. когда в окне DataSources видим DataSet, то можно увидеть так-же его таблицы.

Можно было посмотреть в рефлекторе или исходниках, что же происходит в датасетах — как работает там.

_>Вот код иллюстрирующий проблему:


Нету в этом вашем сообщении описания проблемы. В словах "нигде не могу найти пример реализации второго варианта" и "для получения списка коллекций, которые содержит объект(2)" не понятна суть решаемой Вами задачи. Зачем и как нужно точно формулировать вопрос сказано в http://rsdn.ru/Info/Howtoask.xml.

public class ProdTypeList : BindingList<ProdType> { }

Я осмелюсь рекомендовать вам не играть в сокращения и называть сущности полными именами, например:
public class ProductTypeList : BindingList<ProductType> { }


_>        // вариант 2 - не работает.......
_>        // реализация предусматривающая вывод "списка таблиц";


Вот из этих вот слов все лишь удалось примерно догадаться, чего же вы хотите. Было бы намного удобнее, если бы решаемая вами задача была написана чётко в начале сообщения, а не в коментариях к коду в конце.

_>Убедительная просьба не посылать меня куда подальше...... набродился уже.


Вариантов решения тут может быть несколько. Суть следующая — вам надо у возвращаемого из IListSource.GetList() объекта вернуть в качестве свойств "колонки списка таблиц". Например, если требуется, что бы в качестве списка таблиц был бы такой вот список:
НазваниеКол-во элементов
Продукты5
Типы Продуктов3
то вам нужно добиться того, что бы TypeDescriptor.GetProperties(x) (где x — это то, что вы вернули из IListSource.GetList()) возвращало бы набор из двух PropertyDescriptoro-ов. Да, это совсем не просто и требует некоего "погружения". Почитать об этом можно по ссылкам, данным в этом вот сообщении
Автор: _FRED_
Дата: 14.08.08
.

Например, в датасете данный вопрос решается с помощью ITypedList, но может быть решён и другими способами.

_>просто допишите код.


Дописывать "код" лень, простите :о)

P.S. В следующий раз подобное сообщение, скорее всего, будет проигнорировано: зачем отвечать на вопрос, автор которого (судя по формулировке) сам не приложил достаточно сил даже к постановке цели?
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.