Rambler's Top100
Главная
Новости
Статьи
Форумы
Книги
Коды
Сообщество
Блоги
О нас
 

Логин

Email:
  Пароль:

Войти
Зарегистрироваться
Забыл пароль

Поиск

 Искать :
 
Вперед

Nik Legaloff Blog. Биндим грид коллекцией своих обьектов.. Комментарии.

Биндим грид коллекцией своих обьектов.

Давно отказался я в вебе от датасетов. Да вот засада, когда биндишь тот же ArrayList коллекцией обьектов своего типа, дизайнер никак не подсказывает имена пропертей. Вчера пришла в голову идея, чуть позже появилась её первая реализация.
Идея состояла в том, что бы подсовывать гриду в качестве датасорса свой компонент. А в нём можно в дизайн-тайме подсовывать гриду подготовленный датасет, а в рантайме данные можно брать у делегированного метода(заодно и красиво выносится в отдельный метод выборка данных для грида).

Итак.
Есть у нас к примеру класс Employee, а точней MyApp.Domain.Employee
Находится он к примеру в сборке "MyAppDomain"

Дизайн-тайм. Дизайнер выбирает данные из компонента по интерфейсу IListSource, а точней по его методу IList GetList()
Для него мы создадим датасет и туда добавим табличку с именем "MyApp.Domain.Employee"
После загружаем сборку MyAppDomain и находим там тип MyApp.Domain.Employee
Пробежимся по нему рефлектором и добавим в DataTable колонки с именем property.Name и типом property.PropertyType

всё, теперь можно в GetList возвращать dataSet.DefaultViewManager

Ран-тайм.
Ну а тут наш компонент возвращает данные через IEnumerable, который он и реализует. Использующий нас класс должен реализовать ивент
public event IListHandler GetEnumerableData; который вернёт нам IEnumerable коллекцию.
её то мы и вернём
public IEnumerator GetEnumerator()
{
return GetEnumerableData().GetEnumerator();
}

Ну вот собссно и всё.
Исходники здесь

ЗЫ. Небольшая поправка. На самом деле надо переименовать делегат IListHandler в IEnumerableSourceHandler. Так будет правильней, просто в первоначальном варианте я немного иначе извлекал данные для грида в ран-тайм.

Nik Legaloff

09 August 2005 13:20  Комментарии (7)

09 August 2005 13:49 Max951

Re

Скажу лишь что возвращение из бизнеслогики своих коллекций это хорошая практика и я не сразу к этому пришёлРасстройство, потом лишь только узнал как всё намного проще стало при таком подходе в программированииУлыбка
09 August 2005 14:49 voodoos

Re: Биндим грид коллекцией своих обьектов.

Вопрос рассматривался глубже Улыбка

Я пришёл к выводу, что хорошо бы биндить грид всё же DataTable-ой, но в приложении работать с типизированной коллекцией. Написал компонентик с базовыми классами (Entry и EntryCollection), от которых нужно наследовать такие объекты и их коллекции. Смысл в том, что у колекции есть свойство Table, и изменения синхронизируются между таблицей и объектами в коллекции, т.е. если делается изменение в записи таблицы, то оно автоматом делается и в свойстве объекта и наоборот, то же самое с добавлением/удалением записей и объектов.

В общем, тут
Компонентик сыроват, но рботает, возможно что-то стоит немного переделать или переименовать. Высунутый язык
09 August 2005 15:54 Nik Legaloff

RE Вопрос рассматривался глубже

Не вижу причин для того что бы в run-time в цепочку встраивать DataTable.
Мало того, использование DataTable отменяет возможность использования foreign key mapping(ведь dataTable это только коллекция сущностей без связей с другими обьектами).
К примеру Есть у меня OrderItem. Мой ORM позволяем мне перемещаться по цепочке foreign key. Т.е. я могу получить имя производителя товара, который указан в строке заказа (orderItem.Product.Producer.Name или при биндинге DataItem.Product.Producer.Name )
А ещё из неё я могу получить имя страны клиента, который делал этот заказ(orderItem.Order.Customer.City.Country.Name или при биндинге DataItem.Order.Customer.City.Country.Name )
Всё дерево ты никаки не уместишь в DataTable, ведь свойства обьекта это не только стандартные скаляры, но и ссылки на обьекты иного типа. Дерево м.б. очень сложным. В ВataTable его не уместить, разве что в DataSetУлыбка Но это уже точно не имеет смысла.
09 August 2005 15:58 Nik Legaloff

RE Вопрос рассматривался глубже

ЗЫ.
К тому же в моём случае компонент не предьявляет никаких требований к классу обьекта, которым биндится грид.
ЗЫЫ. Может перенести обсуждение в форум?Улыбка
09 August 2005 16:03 voodoos

Re: Не вижу причин для того что бы в run-time в цепочку встраивать DataTable

Причин множество, если в веб приложениях они не так очевидны, то в декстопных всё не так. Декстопный грид лучше работает именно с таблицами, нежели с коллекциями, гибче получается Улыбка

Я там немного обновил код.
09 August 2005 16:13 voodoos

Re: К тому же

К тому же в моём случае компонент не предьявляет никаких требований к классу обьекта, которым биндится грид.



Да - это плюс. Но ведь всегда это можно запихнуть в базовый класс всех бизнес объектов системы, у меня, к примеру, они от одного базового класса наследуются всегда или же друг от друга, что в итоге то же самое.Улыбка

А вот кстати если в гриде нужно показывать не все поля, тогда как? У там просто это делается. Улыбка
09 August 2005 16:17 voodoos

P.S. Re: К тому же

А вот кстати если в гриде нужно показывать не все поля, тогда как? У меня там просто это делается.


В смысле в десктопном приложении. Подмигивание
 
Наш Киев

Apartments for Rent

Rambler's Top100
Рейтинг@Mail.ru
Идея: Dimon aka Manowar Программирование: Dimon aka Manowar Дизайн: Dan Lebedev
Хостинг от компании Parking.ru
Карта сайта