Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Конструктор кастом контрола с параметром


Автор: HalkaR 14.6.2006, 13:50
Есть свой контрол. У него есть конструктор, принимающий параметр. Проблема в том, что дизайнер периодически выкидывает этот параметр.

Что делать? Как инициализировать контрол в InitializeComponent? Пробовал выносить инициализацию в конструктор формы, но тогда ругается дизайнер форм.
Спасибо! 

Автор: Дрон 14.6.2006, 13:59
Цитата(HalkaR @  14.6.2006,  14:50 Найти цитируемый пост)
Есть свой контрол. У него есть конструктор, принимающий параметр.

ТАК НЕЛЬЗЯ!!!  smile 

Серьёзно. Не надо так делать. Обойдись без этого конструктора.

Сделай какой-нибудь метод, инициализирующий твой контрол и вот его уже запихни в конструктор или даже в Load формы.

Да и зачем вообще это нужно? Можно более поконкретней ситуацию обрисовать?  

Автор: HalkaR 14.6.2006, 14:20
Цитата(Дрон @ 14.6.2006,  13:59)
Цитата(HalkaR @  14.6.2006,  14:50 Найти цитируемый пост)
Есть свой контрол. У него есть конструктор, принимающий параметр.

ТАК НЕЛЬЗЯ!!!  smile 

А почему? Рискую показаться ламером, но почему?

Чем это хуже?

Код

this.cmsListFiles = new System.Windows.Forms.ContextMenuStrip(this.components);
 

Автор: mr.DUDA 14.6.2006, 15:44
На самом деле, нужно сделать 2 конструктора - с параметром и без, и в самом начале твоего конструктора вызывать дефолтный. Тогда и волки будут сыты (дизайнер), и овцы целы (конструктор). 

Автор: Дрон 14.6.2006, 16:06
Цитата(HalkaR @  14.6.2006,  15:20 Найти цитируемый пост)
Чем это хуже?

Хмм... Любопытно.

У меня на работе .NET 2.0 не установлен, но дома я обязательно посмотрю как это сделано. Либо там используется какой-то атрибут, либо как-то переопределён дизайнер.


Цитата(HalkaR @  14.6.2006,  15:20 Найти цитируемый пост)
А почему?

А как в общем случае ты определишь, что за параметры должны туда передаваться? 

Автор: HalkaR 14.6.2006, 16:22
Вобщем у себя я исправил, сделал конструктор без параметра. Но вопрос остался. 

Автор: Дрон 15.6.2006, 00:56
Уфф... После нескольких часов исследования MSDN и кода фрэймворка при помощи рефлектора выдал следующую шнягу (написана под 1.1, но должна без проблем работать и в 2.0)

Короче, при помощи пары атрибутов мы получаем возможность использовать конструктор с параметрами и в дизайнере. Проблемы две:
1) конструктор без параметров всё-таки нужен. Он будет вызываться в design-time. А вот в run-time будет вызываться конструктор с параметрами
2) поскольку это никому не нужный пример, то я не особо заморачиваясь сделал предположение, что как параметры в конструктор будут передаваться поля класса имеющие те же имена, что и формальные параметры.

Класс ParameterSerializer в аттаче. Там же пример кастом контрола, использующего этот класс. 
Для компиляции в references надо добавить System.Design.

Код предоставляется AS IS и как говорится Don't Try This At Home! smile
В .NET можно всё, но по-моему лучше обходиться без таких фокусов.

PS: Обожаю копаться во внутренностях фрэймворка...  

Автор: mr.DUDA 15.6.2006, 10:40
Дрон,  smile 

Вот за что я не люблю design-time... 

Автор: Дрон 15.6.2006, 10:57
Цитата(mr.DUDA @  15.6.2006,  11:40 Найти цитируемый пост)
Вот за что я не люблю design-time...  

Аналогично smile 

Автор: ivashkanet 15.6.2006, 12:36
Дрон, ужас  smile 
Следуя принципу инкапсуляции, я запихнул все методы обновленя DataSet внутрь его самого. Все работает, все хорошо. Но мне понадобилось изменять место, откуда читаются данные. Решил передать расположение данных в конструкторе. 
После этого наткнулся на вышеописанные грабли  smile 
Вопрос: Что посоветуете, заниматься гемором (см. выше) либо положить на инкапсуляцию и заполнять датасет извне, либо сделать в датасете поле, в которое передавать путь?
 smile  smile  smile  

Автор: Дрон 15.6.2006, 12:43
Цитата(ivashkanet @  15.6.2006,  13:36 Найти цитируемый пост)
Что посоветуете

Сделать поле с путём или лучше метод вроде LoadData(string path), который будешь вызывать сам. 

Автор: ivashkanet 15.6.2006, 12:53
Цитата(Дрон @  15.6.2006,  12:43 Найти цитируемый пост)
 LoadData(string path)

Это в принципе так, но мой DataSet постоянно обновляется в RealTime (в другом потоке).
Так что лучше, ИМХО
Цитата(Дрон @  15.6.2006,  12:43 Найти цитируемый пост)
 поле с путём

Спасибо 

Автор: ivashkanet 15.6.2006, 13:27
Цитата(Дрон @  15.6.2006,  12:43 Найти цитируемый пост)
 поле с путём

Сразу после создания объекта запускаются слушатели определенного пути. Этот путь должен браться из поля. Но, получается, слушатели запускаются раньше (при создании объекта), чем я передам правильные пути в параметре  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile

Добавлено @ 13:29 
Может сделать метод Start() у Датаеста??? 

Автор: mr.DUDA 15.6.2006, 16:39
ivashkanet, вынеси из датасета всё что напрямую к датасету не относится. Имею ввиду логику по зачитке данных. 

Автор: ivashkanet 15.6.2006, 18:01
mr.DUDA, так и сделал  smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)