3

以下のコードを使用してLoginFormを実行します。

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new LoginForm());
    //Application.Run(new MainForm());
}

ユーザーがEnterボタンを押すと、LoginFormを破棄または閉じて、MainFormを実行したいのですが、「InvalidOperationExceptionはユーザーコードによって処理されませんでした」という例外が発生しました。

エンターボタンのクリックハンドラーを以下に示します。

private void LoginFormEnterButton_Click(object sender, EventArgs e)
{
    try
    {
        MainForm a = new MainForm();
        a.Show();
        this.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}

LoginFormを破棄し、その後MainFormを正常に実行するにはどうすればよいですか?

4

4 に答える 4

2

メインウィンドウを破棄することはできません。あなたは道を変える必要があります。

まず、MainFormを起動ウィンドウとして設定します。

Application.Run(new MainForm());

MainFormのコンストラクターでLoginFormをロード/表示します。

public MainForm()
{
 LoginForm login=new LoginForm();
 login.ShowDialog();
 InitializeComponent();
}

LoginFormのハンドラーコードをクリックし、

private void LoginFormEnterButton_Click(object sender, EventArgs e)
{
   this.Close();
}
于 2012-06-12T12:53:53.027 に答える
0

アプローチを変えるべきだと思います。

メインフォームの実行を開始します。
メインフォームのLoadイベントで、ログインフォームをモーダルで実行します
。ログインフォーム内で検証を実行し、DialogResult.OKを返します。
メインフォームで、ログインフォームからの戻りに応じて続行または終了します。

[STAThread] 
static void Main() 
{     
    Application.EnableVisualStyles();     
    Application.SetCompatibleTextRenderingDefault(false);     
    Application.Run(new MainForm()); 
} 

public void MainForm_Load(object sender, EventArgs e)
{
     // The using statement will take care of closing and disposing the login form
     using(LoginForm f = new LoginForm())
     {
         if(f.ShowDialog() != DialogResult.OK)
         {
              Application.Exit();
              return;
         }
     }

     // continue with main form processing
}
于 2012-06-12T12:50:50.280 に答える
0

ログインフォームを閉じると、メインのアプリケーションループが終了していると思います。別の方法として、メインフォームでアプリを実行し、ログインフォームをモーダルダイアログとして表示させることはできますか?その後、ユーザーが正常にログインしない場合は、アプリを閉じることができます

于 2012-06-12T12:52:06.663 に答える
0

フォームを渡す代わりにApplicationContextを使用します。

   Application.Run(new TerminalApplicationContext());

ctorで私はフォームを表示します

public TerminalApplicationContext()
{
    login = new FormLogin();
    login.Logon += new FormLogin.LogonDelegate(login_Logon);
    login.Show();
}

次に、デリゲート'login_logon'で、'FormLogin'を破棄し、別のものを表示します。

于 2012-06-12T13:01:13.600 に答える