| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Разработка Windows Forms > менеджер форм |
| Автор: darkness 9.6.2007, 14:49 |
| Надобно создать некоторый менеджер форм в MDI-приложении отслеживающий какие формы открыты, те сделать Activate, а какие закрыты те конечно Show Дело в том, что мне нужно отследить не просто открыта ли это форма или нет (проверка Form.Name), но и ещё с каким параметром. Почему так заумно? Дело в том, что некий DataGridView хранит таблицу, при двойном щелчке на любой Cell открывается форма отображающая подробную информацию об объекте который описан в "щёлкнутой" записе в Гриде... Т.е. в форму с подробной инфой передаются некоторые параметры, на основании чего она и формируется... Если с таким параметорм такая форма уже существует, то её просто надо активировать, если же нет, то завново родить. Задача в принципе несложная. Решил я её через коллекцию (List) структуры, хранящую в себе параметр и само имя, а так же ссылку формы... Код получился немного громоздкий, но всё же рабочий. Потом возник вопрос: А можно ли отследить запущенные формы по нажатым контроллам, которые из вызвали. Особенно интересует подобный механизм в DataGridView ? Как вы себе это представляете ? |
| Автор: Exception 10.6.2007, 17:17 | ||||||||
| Я бы взял за основу http://forum.vingrad.ru/sources/topic-154181.html и модифицировал под свои нужды. В частности, формы следовало бы хранить не в словаре с ключом-строкой, а в словаре с ключом-объектом. Пусть у нас есть классы Animal, Fish и Bird и отображающие информацию о них дочерние MDI-формы AnimalViewerForm, FishViewerForm и BirdViewerForm. Для того, чтобы формы можно было создавать, не зная конкретного типа, мы создадим интерфейс IViewer<T>, и пускай каждая из этих форм его реализует:
Таким образом, форма AnimalViewerForm должна реализовывать IViewer<Animal> и хранить экземпляр класса Animal:
По сути, теперь после создания любой формы нужно установить её свойство HoldObject (и пользовательский интерфейс обновится). Теперь мы реализуем хранилище дочерних форм:
Функция GetForm возратит либо уже созданную форму, либо новую, ассоциированную с объектом key (для каждого объекта будет существовать только одна форма). Функцию RemoveForm я не стал делать обобщённой, потому что реальная проверка соответствия типов нужна только при добавлении в коллекцию. Теперь можно написать:
|
| Автор: Exception 10.6.2007, 17:45 |
| Кстати, пример со слоном сработает только если мы переопределим метод Equals() в классе Animal. |
| Автор: darkness 12.6.2007, 01:49 | ||||||||
Exception, а теперь выношу на критику мой код - "небрежный плод моих забав"
На мой взгляд, лишнего ничего структура не содержит, это будет видно ниже... Далее пишем несколько вспомогательных методов(предикаты, и метод создания формы):
Ну и наконец именно то, что и будет рулить нашими всеми формами:
Вот. Ну ещё один из важных моментов, это проследить закрытие формы, а следовательно избавиться от лишней записи в forms
Вот в принципе и всё.... Что скажете? |
| Автор: Exception 12.6.2007, 17:04 |
| ИМХО, моё решение получше будет. Во-первых, я плохо понимаю, зачем хранить хэш формы -- у тебя же, по сути, каждая форма и так уникально идентифицируется переданным ей параметром? Во-вторых, для изменения типа параметра придётся поменять код (а у меня этого не требуется). В-третьих, а почему ты используешь строковой параметр? Не лучше ли передавать данные в каком-нибудь специально предназначенном для каждой формы классе? В-четвёртых, твоё решение, по очевидным причинам, медленнее (поиск с предикатами работает медленнее, чем выборка по ключу). |
| Автор: darkness 13.6.2007, 02:11 | ||||||||
Exception,
согласен. на выспавшуюся голову гораздо чётче видно обстановку
для изменения типа параметра какого? который string? для моих нужд он всегда будет string...
У меня это строка отправляется потом с запросом в базу....
Вразумил, посему заюзую Dictionary, когда буду править! |