Загрузка...

Пишем переключение форм на C#

Тема в разделе C# создана пользователем RaysMorgan 11 фев 2017. 592 просмотра

Загрузка...
  1. RaysMorgan
    RaysMorgan Автор темы 11 фев 2017 https://lolz.live/support-tickets/open 51 796 7 мар 2013
    Более менее крупные приложения пишутся с использованием нескольких форм, рассмотрим такое приложение:
    У него 3 формы:
    Первая (auth) отвечает за окно авторизации, пока не авторизуешься, во вторую форму попасть не можешь
    Вторая форма (startForm) - главные функции программы, например, это у нас клиент для лолза, то второй формой у нас будет показ форума.
    Третья форма (check_access) показывает простой баннер загрузки программы или проверка, авторизован ли пользователь.

    При старте программы необходимо показать третью форму, чтобы проверить, вошел ли пользователь в свой аккаунт. Начинаем с Program.cs, идём в метод Main, в самый конец пишем открытие третьей формы, она у нас названа как check_access:

    Код
    Application.Run(new check_access());


    [IMG]


    Не забудьте из этого метода Main убрать код, отвечающий за запуск других форм, может быть примерно такой:
    Код
    new auth_form().Show();
    Код
    Form _auth_form = new auth_form();
    _auth_form.Show();


    Переходим к третьей форме. Я надеюсь, что вы умеете пользоваться BackgroundWorker для написания фонового потока, если нет, то позже напишу мануал про него. Итак, в конструкторе формы check_access (третья форма) запускаем наш бекграундворкер:

    Код
    backgroundWorker1.RunWorkerAsync();

    Должно получиться примерно следующее (на лишний код не обращайте внимание, это пример из живого проекта):

    [IMG]


    В backgroundWorker_Work соответственно пишем код для проверки лицензии, я его рассматривать не буду, перейдем к backgroundWorker_RunWorkerCompleted, программа переходит к данному событию, когда выполниться весь код в backgroundWorker_Work

    Здесь легкая проверка на ответ сервера:

    [IMG]

    Код

    if (sR.message == "Access is exists")
    {
    this.Hide();
    new startForm().Show();
    }
    else
    {
    this.Hide();
    new auth().Show();
    }

    Если условие истинно, то мы сворачиваем форму check_access и запускаем главную форму startForm, иначе открываем "форму для авторизации" - auth

    Представим, оказалось, что юзер у нас не авторизован был при проверке в форме check_access или вовсе ваше приложение будет всегда открываться с показа формы для авторизации. Пользователь входит в аккаунт, форма для авторизации сворачивается, а главная форма открывается. Хорошо, вроде работает. Юзер захотел выйти из аккаунта, что будем делать, если у нас уже создан экземпляр формы auth? Не создавать же новую форму и открывать ее... На помощь приходит метод Application.OpenForms, который покажет, какие экземпляры форм уже созданы, получив коллекцию экземпляров форм, можно ими управлять (изменять свойства, скрывать, открывать):

    Переходим к событию, когда пользователь кликнул на кнопку "Выйти из аккаунта":
    Код

    FormCollection formCollection = Application.OpenForms;
    foreach (Form form in formCollection)
    {
    if (form.Name == "auth")
    {
    form.Show();
    }
    }
    this.Hide();

    Здесь мы получаем коллекцию открытых форм, которые можно прокрутить через цикл foreach. В теле цикла проверяем, если название формы равно auth, то мы показываем ее, а в самом конце скрываем главную форму startForm с помощью метода this.Hide()

    Когда пользователь авторизовался можно использовать этот же метод и открыть главную форму:
    Код

    FormCollection formCollection = Application.OpenForms;
    foreach (Form form in formCollection)
    {
    if (form.Name == "startForm")
    {
    form.Show();
    }
    }
    this.Hide();
     
Top