![]() |
|
Модераторы: gambit, Partizan |
![]()
|
|
| darkness |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 5.8.2006 Где: Москва Репутация: нет Всего: 1 |
Надобно создать некоторый менеджер форм в MDI-приложении отслеживающий какие формы открыты, те сделать Activate, а какие закрыты те конечно Show
Дело в том, что мне нужно отследить не просто открыта ли это форма или нет (проверка Form.Name), но и ещё с каким параметром. Почему так заумно? Дело в том, что некий DataGridView хранит таблицу, при двойном щелчке на любой Cell открывается форма отображающая подробную информацию об объекте который описан в "щёлкнутой" записе в Гриде... Т.е. в форму с подробной инфой передаются некоторые параметры, на основании чего она и формируется... Если с таким параметорм такая форма уже существует, то её просто надо активировать, если же нет, то завново родить. Задача в принципе несложная. Решил я её через коллекцию (List) структуры, хранящую в себе параметр и само имя, а так же ссылку формы... Код получился немного громоздкий, но всё же рабочий. Потом возник вопрос: А можно ли отследить запущенные формы по нажатым контроллам, которые из вызвали. Особенно интересует подобный механизм в DataGridView ? Как вы себе это представляете ? --------------------
Вина каких стран Вы предпочитаете в это время суток? (Булгаков. "Мастер и Маргарита") |
|||
|
||||
| Exception |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 4525 Регистрация: 26.12.2004 Репутация: 5 Всего: 186 |
Я бы взял за основу это и модифицировал под свои нужды. В частности, формы следовало бы хранить не в словаре с ключом-строкой, а в словаре с ключом-объектом.
Пусть у нас есть классы Animal, Fish и Bird и отображающие информацию о них дочерние MDI-формы AnimalViewerForm, FishViewerForm и BirdViewerForm. Для того, чтобы формы можно было создавать, не зная конкретного типа, мы создадим интерфейс IViewer<T>, и пускай каждая из этих форм его реализует:
Таким образом, форма AnimalViewerForm должна реализовывать IViewer<Animal> и хранить экземпляр класса Animal:
По сути, теперь после создания любой формы нужно установить её свойство HoldObject (и пользовательский интерфейс обновится). Теперь мы реализуем хранилище дочерних форм:
Функция GetForm возратит либо уже созданную форму, либо новую, ассоциированную с объектом key (для каждого объекта будет существовать только одна форма). Функцию RemoveForm я не стал делать обобщённой, потому что реальная проверка соответствия типов нужна только при добавлении в коллекцию. Теперь можно написать:
|
||||||||
|
|||||||||
| Exception |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 4525 Регистрация: 26.12.2004 Репутация: 5 Всего: 186 |
Кстати, пример со слоном сработает только если мы переопределим метод Equals() в классе Animal.
|
|||
|
||||
| darkness |
|
||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 5.8.2006 Где: Москва Репутация: нет Всего: 1 |
Exception, а теперь выношу на критику мой код - "небрежный плод моих забав"
На мой взгляд, лишнего ничего структура не содержит, это будет видно ниже... Далее пишем несколько вспомогательных методов(предикаты, и метод создания формы):
Ну и наконец именно то, что и будет рулить нашими всеми формами:
Вот. Ну ещё один из важных моментов, это проследить закрытие формы, а следовательно избавиться от лишней записи в forms
Вот в принципе и всё.... Что скажете? Это сообщение отредактировал(а) darkness - 12.6.2007, 01:51 --------------------
Вина каких стран Вы предпочитаете в это время суток? (Булгаков. "Мастер и Маргарита") |
||||||||
|
|||||||||
| Exception |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 4525 Регистрация: 26.12.2004 Репутация: 5 Всего: 186 |
ИМХО, моё решение получше будет.
Во-первых, я плохо понимаю, зачем хранить хэш формы -- у тебя же, по сути, каждая форма и так уникально идентифицируется переданным ей параметром? Во-вторых, для изменения типа параметра придётся поменять код (а у меня этого не требуется). В-третьих, а почему ты используешь строковой параметр? Не лучше ли передавать данные в каком-нибудь специально предназначенном для каждой формы классе? В-четвёртых, твоё решение, по очевидным причинам, медленнее (поиск с предикатами работает медленнее, чем выборка по ключу). |
|||
|
||||
| darkness |
|
||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 5.8.2006 Где: Москва Репутация: нет Всего: 1 |
Exception,
согласен. на выспавшуюся голову гораздо чётче видно обстановку
для изменения типа параметра какого? который string? для моих нужд он всегда будет string...
У меня это строка отправляется потом с запросом в базу....
Вразумил, посему заюзую Dictionary, когда буду править! --------------------
Вина каких стран Вы предпочитаете в это время суток? (Булгаков. "Мастер и Маргарита") |
||||||||
|
|||||||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Разработка Windows Forms | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |