Как бы эту задачу решить попроще...
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Как бы эту задачу решить попроще... Expand / Collapse
Автор
Сообщение
30.03.2006 14:23


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 13.12.2007 18:51
Сообщ.: 3 047, Visits: 33 391
Делаю гридовый контрол, производный от DataGridView [italic](из 2-го фреймворка)[/italic]. Среди прочих есть задача: добавить к объекту Column ряд "своих" свойств. Эти свойства, а также ЧАСТЬ штатных свойств [italic](но не все)[/italic] нужно давать юзеру настраивать в ран-тайме [italic](например, вызывая спец. форму через соотв. пункт контекстного меню грида)[/italic] и результат этих настроек сохранять в БД SQL Server'а.

Решая ранее аналогичную задачу под VB6 [italic](создав "обёртку" над True DBGrid'ом)[/italic], я делал так:
- создал коллекцию ColumnsEx ("extended columns"), каждый элемент которой ColumnEx был на уровне свойств/методов/событий "промаплен" на объект TDBGrid.Column; также там были добавлены "свои" свойства, не имеющие аналогов в TDBGrid.Column;
- получив от источника данных рекордсет, я проходил по его полям, и по каждому полю - добавлял в коллекцию соотв. колонку ColumnEx, в конструкторе которой происходило рождение связанной "настоящей" колонки TDBGrid.Column, немедленно появлявшейся в гриде; допустим, мы сейчас говорим о самом первом запуске, поэтому юзеровские настройки колонки пока ещё неоткуда взять, и колонка создавалась просто с дефолтными свойствами;
- затем [italic](при желании)[/italic] юзер в спец. форме менял настройки каждой колонки ColumnEx, что одновременно влияло и на "настоящую" колонку TDBGrid.Column;
- после завершения всех нужных настроек, юзер жмакал кнопку "Save View", в результате чего я проходил по всем колонкам типа ColumnEx, считывал с каждой значения нужных мне свойств и в определённом текстовом формате сохранял в БД; при повторном открытии грида значения свойств колонок восстанавливались из БД.

Всё довольно просто.
Но хочется сделать ЕЩЁ ПРОЩЕ, задействовав какие-нить новшества из дотнета - типа сериализации и т.д. [bold]Чтобы меньше писАть руками.[/bold]
Есть предложения или идеи?



While (!Life.EOF) { You.Money ++; You.Girls.Add(new Girl(90,60,90)); BeHappy(); }
Сообщ. #894115
30.03.2006 14:54


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 15.03.2008 7:33
Сообщ.: 1 329, Visits: 15 053
Может стоит покопать контрол PropertyGrid? Можно ли его подцепить к объекту, чтобы автоматически отображать свойства, сохранять данные и т.п.
Сообщ. #894119
30.03.2006 17:34


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 13.12.2007 18:51
Сообщ.: 3 047, Visits: 33 391
Отличная идея! Спасибо! Уже привязал [bold]PropertyGrid[/bold] к своему классу, с помощью атрибутов настроил, какие свойства будут доступны через этот грид и как они будут отображаться в гриде. Для сохранения этого всего заюзал сериализацию в XML. Вроде прикольно получилось. Главное - БЫСТРО!

Однако, есть пара вопросов:

[bold]1. Отображение перечислителей.[/bold]

Например, в классе есть вот такой перечислитель:

Public Enum EnAlignments
EA_LEFT = 0
EA_RIGHT = 1
End Enum


И есть свойство:
Public Property Alignment() As EnAlignments


В PropertyGrid оно отобразится как комбобокс с двумя элементами:
[bold]"EA_LEFT"[/bold] и [bold]"EA_RIGHT"[/bold].

А хотелось бы отображать как
[bold]"По левому краю"[/bold] и [bold]"По правому краю"[/bold]
да ещё и с общепринятой иконкой слева.

Интересно, можно ли сие реализовать?!

[bold]2. Отображение boolean-свойств.[/bold]

По дефолту возможен вариант True/False. А хоцца крыжик (чекбокс).

Вот я и думаю (по поводу обоих вопросов):
только через custom draw ячейки грида, или как-то проще можно?



While (!Life.EOF) { You.Money ++; You.Girls.Add(new Girl(90,60,90)); BeHappy(); }
Сообщ. #894154
30.03.2006 17:46


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 13.12.2007 18:51
Сообщ.: 3 047, Visits: 33 391
Оп-па! Ещё один вопросик возник [italic](поскольку я ещё не успел разобраться в [bold]атрибутах[/bold])[/italic]:

Если я имею свойство, которое доступно как для чтения, так и для записи, но по каким-то причинам хочу, чтобы в PropertyGrid'е оно было доступно только для чтения, то я могу влепить перед объявлением этого свойства вот такой атрибут:

[bold][/bold]

А вот как быть, если доступность этого свойства для записи должна зависеть от некоторого условия, вычисляемого в рантайме?! иными словами - можно ли в атрибуте использовать не жёсткую константу [bold]True[/bold], а нечто иное, способное изменяться в рантайме? в общем, напрашивается термин "переменная", только вот я ещё не успел разобраться, насколько сие применимо к [bold]атрибутам[/bold].



While (!Life.EOF) { You.Money ++; You.Girls.Add(new Girl(90,60,90)); BeHappy(); }
Сообщ. #894162
31.03.2006 8:32


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 15.03.2008 7:33
Сообщ.: 1 329, Visits: 15 053
Честно говоря я с этим контролом сильно не копался. Насколько я понимаю технологию .Net, там у любого класса кроме открытых свойств и методов есть еще куча защищеных. Поэтому для получения особого поведения класса обычно создают от него наследуемый класс и пользуют защищенные члены, предоставляющие на порядок больше функциональности. Посмотри в документации на этот контрол, может есть что подходящее.
Сообщ. #894199
31.03.2006 10:16


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 13.12.2007 18:51
Сообщ.: 3 047, Visits: 33 391
Похоже, что-то нашёл:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndotnet/html/vsnetpropbrow.asp



While (!Life.EOF) { You.Money ++; You.Girls.Add(new Girl(90,60,90)); BeHappy(); }
Сообщ. #894208
31.03.2006 16:02


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 13.12.2007 18:51
Сообщ.: 3 047, Visits: 33 391
Хм... вот только не могу понять одну вещь - как менять ширину колонки в PropertyGrid'е? Там всего две колонки: заголовок свойства + значение свойства. И они делят между собой ширину всего грида поровну. Менять эту пропорцию МЫШКОЙ - можно, но вот как программно - не нашёл, хотя вроде пересмотрел в Object Browser'е всю объектную модель этого грида...
Никто не знает?!



While (!Life.EOF) { You.Money ++; You.Girls.Add(new Girl(90,60,90)); BeHappy(); }
Сообщ. #894259
04.04.2006 19:07


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 23.04.2007 23:36
Сообщ.: 1 541, Visits: 16 997
http://www.codeproject.com/cs/miscctrl/bending_property.asp
http://www.codeproject.com/vb/net/Propertygrid_Editor.asp



Сообщ. #894535