Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Общие вопросы по .NET и C# > Конструктор кастом контрола с параметром |
Автор: HalkaR 14.6.2006, 13:50 |
Есть свой контрол. У него есть конструктор, принимающий параметр. Проблема в том, что дизайнер периодически выкидывает этот параметр. Что делать? Как инициализировать контрол в InitializeComponent? Пробовал выносить инициализацию в конструктор формы, но тогда ругается дизайнер форм. Спасибо! |
Автор: Дрон 14.6.2006, 13:59 |
ТАК НЕЛЬЗЯ!!! ![]() Серьёзно. Не надо так делать. Обойдись без этого конструктора. Сделай какой-нибудь метод, инициализирующий твой контрол и вот его уже запихни в конструктор или даже в Load формы. Да и зачем вообще это нужно? Можно более поконкретней ситуацию обрисовать? |
Автор: HalkaR 14.6.2006, 14:20 | ||||
А почему? Рискую показаться ламером, но почему? Чем это хуже?
|
Автор: mr.DUDA 14.6.2006, 15:44 |
На самом деле, нужно сделать 2 конструктора - с параметром и без, и в самом начале твоего конструктора вызывать дефолтный. Тогда и волки будут сыты (дизайнер), и овцы целы (конструктор). |
Автор: Дрон 14.6.2006, 16:06 |
Хмм... Любопытно. У меня на работе .NET 2.0 не установлен, но дома я обязательно посмотрю как это сделано. Либо там используется какой-то атрибут, либо как-то переопределён дизайнер. А как в общем случае ты определишь, что за параметры должны туда передаваться? |
Автор: 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! ![]() В .NET можно всё, но по-моему лучше обходиться без таких фокусов. PS: Обожаю копаться во внутренностях фрэймворка... |
Автор: mr.DUDA 15.6.2006, 10:40 |
Дрон, ![]() Вот за что я не люблю design-time... |
Автор: Дрон 15.6.2006, 10:57 |
Аналогично ![]() |
Автор: ivashkanet 15.6.2006, 12:36 |
Дрон, ужас ![]() Следуя принципу инкапсуляции, я запихнул все методы обновленя DataSet внутрь его самого. Все работает, все хорошо. Но мне понадобилось изменять место, откуда читаются данные. Решил передать расположение данных в конструкторе. После этого наткнулся на вышеописанные грабли ![]() Вопрос: Что посоветуете, заниматься гемором (см. выше) либо положить на инкапсуляцию и заполнять датасет извне, либо сделать в датасете поле, в которое передавать путь? ![]() ![]() ![]() |
Автор: Дрон 15.6.2006, 12:43 |
Сделать поле с путём или лучше метод вроде LoadData(string path), который будешь вызывать сам. |
Автор: ivashkanet 15.6.2006, 12:53 |
Это в принципе так, но мой DataSet постоянно обновляется в RealTime (в другом потоке). Так что лучше, ИМХО Спасибо |
Автор: ivashkanet 15.6.2006, 13:27 |
Сразу после создания объекта запускаются слушатели определенного пути. Этот путь должен браться из поля. Но, получается, слушатели запускаются раньше (при создании объекта), чем я передам правильные пути в параметре ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Добавлено @ 13:29 Может сделать метод Start() у Датаеста??? |
Автор: mr.DUDA 15.6.2006, 16:39 |
ivashkanet, вынеси из датасета всё что напрямую к датасету не относится. Имею ввиду логику по зачитке данных. |
Автор: ivashkanet 15.6.2006, 18:01 |
mr.DUDA, так и сделал ![]() |