2012-01-16 25 views
2

C#.NET winformsアプリケーションを閉じる方法を理解できません。私がしようとしているのは次のとおりです。Application.Run()が呼び出される前に終了(終了)とアプリケーションが呼び出されていますか?

ユーザーが環境を設定できるようにフォームを表示 ユーザーが「OK」ボタンを押した場合、アプリケーション環境を設定するためのロジックを実行します(オブジェクトのインスタンス化など) ユーザーが「キャンセル」を押すか、ウィンドウを閉じると、アプリケーションを閉じます。

問題は、メイン(1st)フォームの前に環境設定フォームを呼び出していることです。最近の要件の変更であり、私が最初から持っているコードを書き直すことは夢中ではありませんでした。

私は(私の小さなプリアンブルよりも多くの意味をなすべきかを)持っているコードは次のとおりです。

public MainForm() 
    { 
     InitializeComponent(); 
     //Get the user to set-up the environment (load specific config files, etc) 

     environmentSetupForm newEnvrionmenSetupForm = new environmentSetupForm(); 
     if (newEnvrionmenSetupForm .ShowDialog() == DialogResult.OK) 
     { 
      newEnvrionmenSetupForm .Close(); 
      //some logic based on what the user selected on the set-up form 
     } 
     else 
     { 
      //Since the user didn't set-up the environment correctly (there 
      //was a message box, informing them and giving them another 
      //shot at it), exit out of the application. 
      Application.Exit(); 
     } 
    } 

私の唯一の問題は、Application.Exit()は、スタックはProgram.csをして実行するに戻ってジャンプした後、

 Application.Run(new MainForm()); 

したがって、メインフォーム(およびアプリ)は関係なく実行されます。私がやろうとしていることをする良い方法はありますか?

編集:明確にするための私のProgram.csのコードを読み取ります

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Windows.Forms; 

    namespace myNamespace 
    { 
     static class Program 
     { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new MainForm()); 
     } 
    } 
    } 

答えて

2

フォームのコンストラクタもOnLoadイベントもLoadイベントもこのコードを置くのには適していません。コンストラクターは、Application.Run()呼び出しの前に、Main()メソッドのnew MainForm()ステートメントのために実行されます。 ApplicationクラスがApplication.Run()がメッセージループに入る直前に、ApplicationクラスがShow()メソッドを呼び出すため、Loadイベントが発生します。 Application.Exit()は、そのメッセージループが実行を開始するまで何もできません。

回避策は、このコードをProgram.csのMain()メソッドに移動することです。

[STAThread] 
    static void Main() { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     MainForm main;    
     using (var dlg = new environmentSetupForm()) { 
      if (dlg.ShowDialog() != DialogResult.OK) return; 
      // Use dlg values 
      //... 
      main = new MainForm(); 
      // Make main form show up at the same location 
      main.StartPosition = FormStartPosition.Manual; 
      main.Location = dlg.Location; 
     } 
     Application.Run(main); 
    } 
-1

は、以下のコード移動 "のInitializeComponentを();" MainForm_Loadイベントへ

Mainform_Loadイベントでは、Application.Exit()を実行する代わりに、フォームを閉じる()だけで、アプリケーションも終了するはずです。

+0

正しいサンプルコードを提供しているか、program.csコードを組み込むように編集しているかどうかを確認できますか?これが問題です。 –

+0

@JesusSalas:Program.csを含めるように編集しました –

+2

@JamieTaylorイエスは正しいです。あなたが記述したものは、コードが行うものと同じではありません。 'Application.Exit()'の呼び出しの後に何が起きているのか間違っています。あなたは既に 'Application.Run()'で*実行中ですので、もう一度入力しません。あなたのロジックはどこか後方になければなりません。 –

2

ロジックをコンストラクタからメインメソッドに移動します。 アプリケーションの起動に関連するものであり、フォームではないので起動ロジックの一部としてそれを持つことは意味があります。それはモーダルだと実行を停止し、コンストラクタで良いアイデアではない、特にため、ロジックのようなものを持っ

static void Main()    { 
    Application.EnableVisualStyles();    
    Application.SetCompatibleTextRenderingDefault(false); 
    var newEnvrionmenSetupForm = new environmentSetupForm(); 
    if (newEnvrionmenSetupForm .ShowDialog() == DialogResult.OK)   { 
     newEnvrionmenSetupForm .Close(); 
     //some logic based on what the user selected on the set-up form 
     var mainform = new MainForm(); 
     Application.Run(mainform);    
    } 
} 

。あなたは、コンストラクタがオブジェクトの単純な初期化であり、繰り返し可能であることを望みます。例えば。ある時点で再度メインフォームを作成する必要があった場合は、その時点でポップアップしたくないと思います。

関連する問題