c # MDI родительская форма + ошибка формы входа - PullRequest
0 голосов
/ 11 марта 2011

Я получаю эту ошибку:

Запуск второго цикла сообщений в одном потоке не является допустимой операцией. Вместо этого используйте Form.ShowDialog.

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

    public frmMainMDI()
    {
        InitializeComponent();
        frmLogin frmLogin_ = new frmLogin(); //create new login form
        frmLogin_.ShowDialog(); //show i
        if (frmLogin_.DialogResult == DialogResult.Cancel) //if user pressed cancel
        {
            frmLogin_.Dispose(); //dispose login form
            Application.Exit(); //Exit application. If I used this line, it throws the error stated above in Program.cs
            //this.Dispose(); //If I try to use this one instead, it throws an 'already disposed' error
            //this.Close(); //same error as .dispose
        }
        else
        {
            intCurrentLoggedInStaffID = frmLogin_.intStaffID;
        }
    }

И это в моей программе.cs:

    static void Main()
    {

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new frmMainMDI()); //this is the line that bugs out

    }

Я не совсем понял. Похоже, что приложение пытается перезапустить себя, когда я пытаюсь .Exit его. Я скучаю по чему-то довольно фундаментальному здесь? (Я предполагаю, что ответ «да»)

Ответы [ 2 ]

1 голос
/ 11 марта 2011

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

Ваш файл program.cs:

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        LoginForm loginForm = new LoginForm();
        if (loginForm.ShowDialog() != DialogResult.Cancel)
        {
            MainMdiForm mainMdiForm = new MainMdiForm();
            mainMdiForm.intCurrentLoggedInStaffID = loginForm.intStaffID;
            loginForm.Dispose();
            loginForm = null;
            Application.Run(mainMdiForm);
        }
    }

Ваш конструктор в MainMdiForm должен содержать только вызов InitializeComponents.

0 голосов
/ 11 марта 2011

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

Я хотел бы предложить, чтобы вы переместили свой логин / код диалога в вашу функцию program.cs / Main (). Вот как то так:

static void Main()
{

    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    using(frmLogin frmLogin_ = new frmLogin()) { //create new login form
       frmLogin_.ShowDialog(); //show i
       if (frmLogin_.DialogResult == DialogResult.Cancel) //if user pressed cancel
       {
           return; // This exits your application
       }
    }

    Application.Run(new frmMainMDI()); //this is the line that bugs out

}
...