![]() |
|
Модераторы: gambit |
![]()
|
|
| Wanderer2019 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 937 Регистрация: 3.12.2004 Где: Санкт-Петербург/П рага Репутация: 1 Всего: 17 |
И снова я, и опять про контролы =)
От предыдущего поста и описанной в нем реализации пришлось отказаться... Решил писать свой контрол наследованные от Control и INamingContainer. Используя это, его можно засунуть в dll + вытащить на тулбар студии, что является весьма полезной вещью. Но вот наткнулся на такую непонятку... Мой контрол содержит в себе TreeView. С ним собстно и ведется работа. При вытаскивании контрола на aspx страницу он почему то внутрь моего контрола пишет этот TreeView. т.е. мой контрол является как бы контейнером. Так и должно быть? Но это еще пол беды.. самое плохое, что при возникновении события вылетает такой вот Exception =(
вот тут я совсем не понияю в чем дело.. т.е. получается, что дизайнер сам добавляет этот TreeView внутрь моего контрола - контейнера, так он еще и путается в чем то??? |
|||
|
||||
| tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 34 Всего: 170 |
Класс, реализующий INamingContainer становится контейнером имен для всей своих внутренних контролов. Обеспечивает уникальность имен.
Например, если ты на странице выложишь два своих юзер-контрола c ID MyControl1 и MyControl2, то TreeView у них будут иметь разные UniqueID, такие как MyControl1$TreeView1 и MyControl2$TreeView1. так что твой класс - контейнер для TreeView. По поводу exception - покажи код класса и страницы. -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
| Wanderer2019 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 937 Регистрация: 3.12.2004 Где: Санкт-Петербург/П рага Репутация: 1 Всего: 17 |
Убрал наследвание от INamingContainer и ошибка пропала... однако внутри Mycontrol по прежнему продолжает появляться тег TreeView.... можно вообще как то этого избежать??? |
|||
|
||||
| tol05 |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 34 Всего: 170 |
Wanderer2019,
Без кода трудно что-то понять. вот например, набрал такой код:
скомпилил в dll, подключил к ToolBar, выложил на страницу
Код сгенерировала студия. Нет никаких вложенных тегов -------------------- На хорошей работе и сны хорошие снятся. |
||||||
|
|||||||
| Wanderer2019 |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 937 Регистрация: 3.12.2004 Где: Санкт-Петербург/П рага Репутация: 1 Всего: 17 |
ну вот собстно такой код:
по размещении на форме получается вот что:
и все бы отлично.. но после манипуляций (запуск приложения) в коде появляется вот что:
откуда оно берется ??? |
||||||
|
|||||||
| Wanderer2019 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 937 Регистрация: 3.12.2004 Где: Санкт-Петербург/П рага Репутация: 1 Всего: 17 |
Более того.. после изменения одного из свойств.. внутри тега, описывающего непосредственно мой компонент появляются еще теги TreeView... т.е. под каждый набор свойств студия дописывает туда свой TreeView....
|
|||
|
||||
| tol05 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 34 Всего: 170 |
Значит о первом посте
У тебя в конструкторе стоит EnsureChildControls(). Она проверяет, созданы ли дочерние контролы и если нет - создает их (вызывает CreateChildControls()) Когда ты что-то меняешь в PropertyWindows, студия создает объект каждый раз заново (это и для WinForms также. Это работа визуального дизайнера так устроена). Поэтому у тебя и вызывается конструктор, а дальше - EnsureChildControls(). И значения тегов страницы те же, что и в CreateChildControls(). Чудес не бывает. Все нормально. Ты ведь через PropertyWindows инициализируешь какие-то свойства контрола, должна же где-то хранится эта инфформация? Вот она со страницей и хранится, не в dll же студии писать? Второй пост: клонирование. С клонированием дочерних тегов: прикольно. Во-первых ты не проверяешь созданы ли уже дочерние контролы или еще нет. А для этого от Control у тебя есть свойство ChildControlsCreated. Как EnsureChildControls() узнает созданы ли дочерние контролы? Смотрит это свойство! во-вторых. Ты в конструкторе вызываешь виртуальную EnsureChildControls(). От этого булшит. Убрал я все из конструктора. Нет никаких внутренних тегов. (конструктор по умолчанию нечиго не содержит) Ее нужно использовать тогда, когда ты собираешься работать с дочерними контролами. Связок между твоим контроломи дочерними я не нашел, поэтому ткнул this.EnsureChildControls() в свойства. Теперь когда ты просто кидаешь контрол на форму, он не содержит нечего лишнего. Если иницициализируешь дочерние контролы через дизайнер, то тогда инфа будет хранится на странице, как положено. Код:
и последнее: для уменьшения геморроя мелкомягкие предлагают использовать CompositeControl вместо Control для составных элементов. Правда только в ASP.NET2.0 Ну, кажись все, я кончил! -------------------- На хорошей работе и сны хорошие снятся. |
||||
|
|||||
| Wanderer2019 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 937 Регистрация: 3.12.2004 Где: Санкт-Петербург/П рага Репутация: 1 Всего: 17 |
tol05,
спасибо за помощь.. разобрался однако ввиду необнаруженных возможностей... решил наследоваться от WebControl... по ряду причин оказалось намного удобнее (наличие стандартных свойств и т.д.) создание контролов переписал как ты указал: через свойства + перегрузка EnsureChildControls(). НО! Почему теперь то нельзя засунуть EnsureChildControls в конструктор? все равно ж теперь проверяется CreatedChildControls..., а так все же на форме его сразу видишь.. как перетащил из ToolBox`а... или я не прав?? |
|||
|
||||
| tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 34 Всего: 170 |
И тебе спасибо.
Потому что студия пытается все проимитировать в режиме дизайна, да криво. Берет код своего класса, строит контролы, а потом тупо парсит теги с HTML страницы (с предыдущего рендеринга), а вдруг ты их ручками дописал? Ну и добавляет их туда же. Я специально подебагал в той же студии, все нормально сработало, не добавляются лишние дочерние контролы. Я имею в ввиду, что засунул EnsureChildControls в конструктор Это сообщение отредактировал(а) tol05 - 27.4.2007, 15:50 -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Любитель, Mymik, mr.DUDA. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Разработка под ASP.NET | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |