Сложность корректного отображения форм «логин» и «основной» - PullRequest
0 голосов
/ 25 января 2020

У меня есть приложение WinForms с формой для входа и основной формой. Форма входа содержит два текстовых поля для ввода учетных данных пользователем, кнопку «ОК» и кнопку «Отмена». Следующий код является обработчиком события для кнопки OK:

        private void button_OK_Click(object sender, EventArgs e)
        {
            if (authenticated())
            {
                this.Close();
                Application.Run(new MainWindow());
            }
            else
            {
                MessageBox.Show("Incorrect credentials", "Retail POS", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }    
        }

Проблема в том, что он сохраняет диалоговое окно входа в систему при открытии главной формы. Я попытался выполнить sh желаемое поведение, показав форму входа в качестве модального диалога, вызвав ShowDialog() из Program.cs, но это не привело к желаемому поведению.

Обратите внимание, что основная форма имеет возможность выйти из системы. То есть следует удалить основную форму и снова отобразить форму входа.

Код Program.cs:

static void Main()
{
    LoginForm loginForm = new LoginForm();
    loginForm.ShowDialog();
}

В результате выдается сообщение, что второе сообщение l oop не может быть запущено.

1 Ответ

1 голос
/ 25 января 2020

Тебе нужно спрятать свой кулак. Вы можете сделать это с помощью this.Hide()

Будьте осторожны с позицией this.Hide().

Если вы используете mainForm.Show();, вы можете разместить его до или после него, но если вы используете mainForm.ShowDialog(); вы можете поместить его только перед ним, так как ShowDialog() останавливает выполнение кода до тех пор, пока форма, вызвавшая этот метод, не будет закрыта.

С program.cs вы запускаете свое приложение с Application.Run(YourMainForm)

, так как вы хотите, чтобы ваш LoginForm был первым при открытии приложения, вы должны создать его внутри Program.cs и передать его внутрь Application.Run() следующим образом:

...
LoginForm lf = new LoginForm();
...
Application.Run(lf);

Теперь у нас отображается LoginForm. Мы не можем закрыть его, так как наше приложение закроется (так как это основная форма)

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

private void button_OK_Click(object sender, EventArgs e)
{
    if (authenticated())
    {
        MainWindow mw = new MainWindow();
        mw.Show();
        this.Hide();
    }
    else
    {
        MessageBox.Show("Incorrect credentials", "Retail POS", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    }
}

Теперь у нас отображается MainForm, а логин скрыт.

Поскольку вы хотите, чтобы пользователь мог выйти из системы, вы можете сделать это двумя способами:

Сначала когда пользователь нажимает кнопку, мы делаем это:

LoginForm lf = new LoginForm();
lf.Show();
this.Close(); //We assume that button is placed in your main form

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

Другой эффективный способ заключается в том, что внутри файла Program.cs мы не создаем LoginForm экземпляр внутри Main() функция, но снаружи и пометить его как public static

Это будет выглядеть так:

Program.cs

...
static class Program
{
    ...
    public static LoginForm mainForm;

    static void Main()
    {
        ....
        mainForm = new LoginForm();
        Application.Run(mainForm);
    }
}

Теперь, когда у нас есть это и пользователь нажмите Logout в вашем MainWindow вы делаете не нужно создавать новый экземпляр LoginForm, но вы можете просто Show() существующий (основной) с помощью Program.mainForm.Show()

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