|
|
|
Supreme 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(); }
|
|
|
|
|
Supreme Being
      
модератор
Last Login: 15.03.2008 7:33
Сообщ.: 1 329,
Visits: 15 053
|
|
| Может стоит покопать контрол PropertyGrid? Можно ли его подцепить к объекту, чтобы автоматически отображать свойства, сохранять данные и т.п.
|
|
|
|
|
Supreme 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(); }
|
|
|
|
|
Supreme 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(); }
|
|
|
|
|
Supreme Being
      
модератор
Last Login: 15.03.2008 7:33
Сообщ.: 1 329,
Visits: 15 053
|
|
| Честно говоря я с этим контролом сильно не копался. Насколько я понимаю технологию .Net, там у любого класса кроме открытых свойств и методов есть еще куча защищеных. Поэтому для получения особого поведения класса обычно создают от него наследуемый класс и пользуют защищенные члены, предоставляющие на порядок больше функциональности. Посмотри в документации на этот контрол, может есть что подходящее.
|
|
|
|
|
Supreme Being
      
модератор
Last Login: 13.12.2007 18:51
Сообщ.: 3 047,
Visits: 33 391
|
|
|
|
|
|
Supreme 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(); }
|
|
|
|
|
Supreme Being
      
участник
Last Login: 23.04.2007 23:36
Сообщ.: 1 541,
Visits: 16 997
|
|
|
| |