|
|
|
 |
 |
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
|
| 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: К тому жеА вот кстати если в гриде нужно показывать не все поля, тогда как? У меня там просто это делается.
В смысле в десктопном приложении.
|
|
|
|
 |
 |
 |
 |
|
|