| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Справочники |
| Автор: dazy 25.6.2009, 20:46 |
| Как реализовать подобный сценарий, а может он реализован уже: Есть куча справочников, какие посложнее, какие попроще. Для разных справочников есть разные формы где можно делать создание/удаление/изменение элементов справочника. Есть форма, на которой пользователь выбирает элементы этих справочников. Пользователь может открыть форму выбора для справочника, или форму редактирования справочника. На форме может быть много полей для заполнения из справочников. Вопрос, как сделать универсальный контрол который бы работал как фронт-енд для справочника - показывал бы текущий выбранный элемент, запускал бы форму выбора элемента, запускал бы форму редактирования справочника? Хм, написал вот, и понял, что написал все то что уже работает в 1С 8.0 ))) Ну в общем да, именно это и нужно. Интересует не именно как сделать контрол, а какой подход лучше использовать. Чем лучше пользоваться чтобы собрать такую штуку? Может кто знает где можно глянуть подобные наработки? |
| Автор: Conkistador 26.6.2009, 09:08 | ||
Возможно Вам подойдет какая нибудь ORM система типа NHibernate, но это немного не то всетаки. По поводу опыта, реализовывали мы подобную задумку для простых справочников из 2 -5 полей. Организованно было на MS SQL через получение данных из системных таблиц о количестве полей в произвольной таблице и о ключевых полях... Все работало но любая универсализация это дополнительная головная боль, так что рекомендую подумать еще несколько раз "а оно вам надо" |
| Автор: dazy 26.6.2009, 10:49 | ||||
Ну в качестве ОРМ - EF подойдет. Тут вопрос в другом, не как хранить данные, а как их обрабатывать. Как сказать контролу, что если к нему подключен ДатаКонтекст, ну к примеру "Банки", то чтобы контрол мог вызвать форму заполнения/выбора банков. А в следующем экземпляре того же контрола ДатаКонтекст уже "Валюты", и контрол для редактирования/выбора вызывает форму предназначенную для валют. Подозреваю, что тут нужно грамотно интерфейс нарисовать и пристыковать через него к каждому классу сущности - формы для редактирования. Т.е. еще надо хранить информацию, к какому классу какая форма относится. Только ясности в этом вопросе у меня нет.
Да интересно просто! |
| Автор: Idsa 26.6.2009, 12:08 |
| ORM, действительно, придется очень кстати. К тому же я бы посоветовал использовать один статический контекст, чтобы избавить себя от проблем с Attach/Detach и, как следствие, с добавлением, удалением и обновлением элементов. |
| Автор: dazy 26.6.2009, 15:14 | ||
Т.е. можно написать что то вроде ShowFormByMagic("MySuperForm"); и MySuperForm стартанет? И это называется рефлекшн, я правильно понял? Или же лучше в классе сущности хранить тип формы для редактированя, и запускать ее "обычным" образом? |
| Автор: SaS1 26.6.2009, 18:51 |
| dazy, У нас на проекте судя по всему реализовано то, что вам нужно. Для каждого Справочника мы формы отдельные не делали. Форма одна, но хитрая - она смотрит на класс объекта, который нужно отобразить или редактировать или добавить и если видит там строковое поле - добавляет текст бокс, для булевского - чек бокс, для енума - комбик и т.д. для какого-нибудь класса - типо лукап. Ты получается эти поля заполняешь или едитишь, жмякаешь сохранить и оно у нас сохраняет специально написанным фреймворком, используя мэпинг на базу (когда начинали писать - Hibernate ещё не было:( ща переходим на него.) Но реально проект у нас ОЧЕНЬ большой и поэтому написание такой хитрой формы оправдано хоть и гемороя с ней много, а для небольшого проекта это неоправданно тяжело пишется :( |
| Автор: dazy 26.6.2009, 19:10 |
| SaS1, Т.е. у вас для выбора/редактирования все же разные формы? Или вообще одна, просто работает в разных режимах? |
| Автор: Conkistador 28.6.2009, 00:47 | ||||
ну я бы сказал вот это называется созданием класса по названию через рефлексию:
Добавлено через 9 минут и 53 секунды dazy, я бы одратил больше вимания на эту фразу Вот смотрите в теории Вам наверное хочется что бы отдав кому то (контрол,форма ...) таблицу или класс построенный на основании таблицы, Вы получили бы набор полей с определенным поведением, а потом что бы этот элемент управления сумел еще и правильно распознать как сохранить измененные данные. Для этого необходимо 1. Каким то образом найти ключевые поля таблицы (например из системных таблиц) 2. Отобразить различные элементы управления (textbox и т.д.) и связать их с соответствующими полями 3. Правильно сохранить изменения все еще интересно ;) |
| Автор: dazy 28.6.2009, 20:15 | ||
С этим, как раз, проблем нет. Я в основном упираюсь в сильверлайт, а там есть замечательная штука - RIA services. Делает практически тоже самое что вы и описали, как говорится out of the box. Отдаешь сущность, и говоришь, а построй мне форму по вот этой сущности - она строит, и валидацию прописывает, и описания показывает, определяет поля обязательные для заполнения и т.д. Но дело не в этом, речь не о том, чтобы форму построить. Сам я не очень доверяю автогенераторным формам. Речь о том, чтобы для каждой сущности запускать свою собственную форму редактирования. Т.е. у контрола есть кнопка "править" нажимаем на нее, и запускается форма для редактирования той сущности которая связана с этим конролом. А уж будет эта форма вручную написана или сгенерированая автоматом, это дело десятое. |
| Автор: Conkistador 29.6.2009, 09:27 | ||
я же привел вверху пример как можно создать класс по названию, что Вам мешает связать с вашими сущностями строки типа "MyProg.Form1" а потом создав по названию класса экземпляр, вызвать метод Show() ? |
| Автор: dazy 29.6.2009, 11:11 | ||
Да я понял, буду разбираться, спасибо. Я так просто, ворчу для поддержания беседы ))) |