Проблемы с закрытием формы Windows C # - PullRequest
1 голос
/ 30 марта 2009

У меня проблемы с закрытием приложения формы C # windows. В настоящее время он просто даст мне пустую форму без заголовка или чего-либо еще. Мне нужно найти способ закрыть это маленькое неизвестное окно.

У меня есть 2 страницы формы, одна для экрана входа в систему и одна для реального приложения. Все они запускаются файлом program.cs.

Program.cs

...
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new PROG1());
}

Это просто базовая основа, созданная Visual Studio для запуска моей программы.

Тогда у нас есть основная программа

PROG1.cs

...
public PROG1()
{
    Login LoginForm = new Login();
    DialogResult a = LoginForm.ShowDialog();

    if(LoginForm.ValidLogin == 1) {
        InitializeComponent();
    } else {
        Application.Exit(); //FAIL
    }
}

Вы можете видеть, что первый файл program.cs вызывает PROG1.cs, который вызывает экземпляр login.cs. Если вы введете действительный логин, страница входа закроется, и основной PROG1 отобразится так, как должно. Однако, если вы просто нажмете красную букву X, чтобы закрыть форму входа, это произойдет с Prog1 и LoginForm.ValidLogin! = 1, поэтому он не инициализирует форму и попытается закрыть форму. Это просто оставит мне неинициализированную форму вместо того, чтобы закрывать ее. Если я вместо этого сделаю this.close (), это вызовет ошибку времени выполнения.

Есть идеи?

Ответы [ 4 ]

4 голосов
/ 30 марта 2009

Поместите вызов InitializeComponent обратно наверх, где он был раньше. Пытаться использовать неинициализированные переменные, в том числе пытаться заставить их закрыться, - плохая идея.

Настройте свойства формы PROG1, чтобы исходное состояние было скрыто, а не показано. После того как LoginForm вернется, ваш код PROG1 может решить, показывать себя или закрывать себя.

2 голосов
/ 30 марта 2009

Является ли причиной того, что вы не инициализируете форму в случае сбоя, потому что содержимое метода InitializeComponent () выполняется очень долго? Кажется, вы должны просто упростить свою программу до этого:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    LoginForm login = new LoginForm();

    if (login.ShowDialog() == DialogResult.OK &&
        login.ValidLogin == 1)
    Application.Run(new PROG1());
}

И удалите логику из конструктора PROG1.

1 голос
/ 30 марта 2009

Я бы порекомендовал лучшую практику, как предлагает Самуил. Но если вы хотите что-то быстрое, попробуйте переместить логику входа в систему в сгенерированном Visual Studio Main:

In Program.cs

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        Form2 login = new Form2();
        if (login.ShowDialog() == DialogResult.Yes)
        {
            Application.Run(new Form1());
        }
    }

В Form2.cs

    private void button1_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.No;
        this.Close();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.Yes;
        this.Close();
    }
1 голос
/ 30 марта 2009

Вы не должны делать что-то подобное в конструкторе.

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

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