Обработка нескольких форм в приложении C # - PullRequest
2 голосов
/ 24 апреля 2009

Я пытаюсь изменить приложение WinForms на C #, которое использует несколько форм. При запуске отобразится окно входа в систему. Если пользователь входит в систему с правильным сочетанием имени пользователя и пароля, форма с тремя различными вкладками будет отображаться как вид администратора. Если пароль или имя пользователя не указаны, будет показан значительно упрощенный графический интерфейс. В основном он состоит из двух кнопок, которые в свою очередь показывают эти две формы в зависимости от того, какая кнопка нажата:

Кнопка 1: предоставить пользователю доступ к форме, состоящей из нескольких текстовых полей, в которые пользователь может ввести информацию, которая будет сохранена в базе данных. После успешного выполнения DB-операции снова отобразится первая форма с двумя кнопками.

Кнопка 2: отображается форма, где пользователь может ввести код, который будет записан в БД. После завершения операции с БД пользователь автоматически вернется к исходной форме с помощью двух кнопок.

Обе формы также будут иметь кнопку «Назад» для возврата пользователя к первой форме. У меня много логики, но я не уверен, как лучше всего справиться со всеми формами. Где я должен создать первую (логин) форму? Как только проверка логина завершена, есть два возможных пути. Либо показать форму администратора с вкладками (если имя пользователя и пароль верны), либо упрощенную форму пользователя с двумя большими кнопками. Также должна быть возможность выхода из формы администратора, чтобы вместо этого отображался упрощенный графический интерфейс.

Я надеюсь, что здесь есть смысл. Мне просто нужен хороший способ обработки всех форм и навигации между ними. В настоящее время нет необходимости передавать данные между ними, но это может стать проблемой в будущем, поэтому решение, учитывающее это, будет превосходным.

Я думаю, что на самом деле нужен класс, который обрабатывает отображение и удаление форм с самого начала, но я не совсем уверен, куда мне поместить экземпляр этого класса обработки.

Ответы [ 3 ]

5 голосов
/ 24 апреля 2009

Я только что сделал что-то подобное. У меня был набор форм для управления в виде «страниц», как их назвала спецификация. У меня также был строгий поток страниц, который был немного сложнее, чем у вас. Я расскажу тебе об этом.

Я спроектировал каждую «страницу» взаимодействия как UserControl и создал «OuterForm» и «Controller». Контроллер имел метод Navigate (string pageName), а внешняя форма содержала панель, а также метод Display (Control page), который очищал дочерние элементы на панели и добавлял замену.

Я использовал Spring.NET для настройки контроллера и формы и использовал метод установки для создания двусторонней связи между ними. Это означало, что мой основной метод мог запросить Spring для формы и просто отобразить ее, используя Application.Run (form);

Я создал удобный метод для доступа к контроллеру из обработчиков событий, и я бы сделал, например, Controller.Instance.Navigate (chosenPage); Контроллер также использовал Spring.NET для загрузки правильного UserControl для selectedPage, а затем вызвал в главной форме для Display () загруженный экземпляр. Там нет ни кода Spring.NET ни в каком пользовательском элементе управления, ни новых ключевых слов; -)

Преимущество использования Spring.NET для меня заключается в том, что у меня был один класс форм, который просто отслеживал некоторую бизнес-логику и отображал индикатор выполнения. Мне удалось реализовать это один раз и настроить многие экземпляры этой формы, внедряемые с другой бизнес-логикой, которую она будет отслеживать. Кроме того, мне нужно было заглушить интерфейсы для конкретных аппаратных частей и веб-сервисов. В итоге я переместил поток страниц в конфигурацию.

3 голосов
/ 24 апреля 2009

Управление формой может быть сложной задачей. Есть несколько разных способов:

  • Просто заставьте формы плавать на экране. Пусть некоторый статический класс содержит ссылки на различные формы и предоставляет методы для их активации.
  • Вместо этого реализуйте формы как UserControls, поместите их в одну и ту же форму, а также покажите и скройте элементы управления соответствующим образом (это также может быть достигнуто путем загрузки форм, удаления границ форм и т. Д. И установки их родительского элемента на панель или что-то подобное похоже, это почти заставит их вести себя как пользовательские элементы управления, но только почти)
  • Конечно, есть много других способов; о)

Когда дело доходит до управления формой входа, я делал бы это в методе Main; показать форму входа в систему, проверить учетные данные, а затем создать экземпляр пользовательского интерфейса, который вы хотите показать, и передать его методу Application.Run.

1 голос
/ 26 апреля 2009

Рассматривали ли вы использование Composite UI framework? В вашем случае вы можете использовать WinForms с CAB .

Одним из больших преимуществ является поддержка аутентификации на основе ролей. Аутентифицированный сеанс может соответствовать одной роли, неаутентифицированный сеанс может соответствовать другой роли. Таким образом, вы можете отображать разные экраны в зависимости от роли пользователя.

Еще одним преимуществом является ответ на вопрос о том, кто отвечает за создание экземпляров экранов. Это управляется контроллером, и действия на экранах (например, нажатие кнопки) могут отправлять события на этот контроллер.

И последнее, но не менее важное: есть несколько хороших примеров и определенно поддерживается более продвинутые сценарии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...