2016-08-02 7 views
0

私はトレイから実行できる多くのフォームを持つアプリケーションを持っています。しかし、ユーザーが2つのフォームを実行すると、最後のフォームだけが閉じられます。 2番目のフォームが閉じられると、最初のフォームが再び動作します。多くのフォームを動作させるにはどうすればよいですか?

ウィンドウ内の他のプログラム(たとえば、同じWebブラウザの多くのウィンドウ)のように、常に多くのフォームを動作させる方法はありますか?

私はインターネット上で見つけたコードの一部です。私はそれを見せたり、隠したりするために使っています。

 public MyApplicationContext() 
    { 

     MenuItem SmsMenuItem = new MenuItem("SMS", new EventHandler(ShowSms)); 
     MenuItem ExitMenuItem = new MenuItem("Wyjdź", new EventHandler(Exit)); 
     MenuItem HistoryMenuItem = new MenuItem("Historia", new EventHandler(ShowHistory)); 


     NotifyIcon notifyIcon = new NotifyIcon(); 
     notifyIcon.Icon = SMSapp.Properties.Resources.Icon1; 
     notifyIcon.ContextMenu = new ContextMenu(new MenuItem[] { SmsMenuItem, HistoryMenuItem, ExitMenuItem }); 
     notifyIcon.Visible = true; 
    } 

    void ShowSms(object sender, EventArgs e) 
      { 
     if (Globals.globals.Set.DBConn) 
     { 
      UnitOfWork uow = new UnitOfWork(); 
      using (SmsForm sm = new SmsForm(uow)) 
      { 
       if (sm.Visible) 
        sm.Focus(); 
       else 
        sm.ShowDialog(); 
      } 
     } 
     else 
     { 

      using (SmsForm sm = new SmsForm()) 
      { 
       if (sm.Visible) 
        sm.Focus(); 
       else 
        sm.Show(); 
      } 
     } 
    } 

    void ShowHistory(object sender, EventArgs e) 
    { 
     if (Globals.globals.Set.DBConn) 
     { 
      UnitOfWork uow = new UnitOfWork(); 
      using (HistoryForm sm = new HistoryForm(uow)) 
      { 
       if (sm.Visible) 
        sm.Focus(); 
       else 
        sm.ShowDialog(); 
      } 
     } 
     else 
     { 
      using (HistoryForm sm = new HistoryForm()) 
      { 
       if (sm.Visible) 
        sm.Focus(); 
       else 
        sm.ShowDialog(); 
      } 
     } 
    } 

    void Exit(object sender, EventArgs e) 
    { 
     notifyIcon.Visible = false; 
     Application.Exit(); 
    } 
+0

新しいフォーム –

+0

を開いたときに 'ShowDialog()'の代わりに 'Show()'を使ってみてください。それは私がやった最初のことでした。しかし、ウィンドウが表示され、すぐに消えます。 – AnotherSimpleName

+0

'ショー'が正しいです。それが機能するように助けが必要な場合は、[mcve] –

答えて

1

問題は、親フォームと他のフォームもクリックできるようにShowDialog()の代わりにShow()を使用する必要があります。

また、usingの中のステートメントを実行した後に新しいフォームを削除すると、フォームが消えるため、メソッドからusingを削除してください。

void ShowSms(object sender, EventArgs e) 
{ 
    SmsForm sm = new SmsForm();     
    if (sm.Visible) 
    sm.Focus(); 
    else 
    sm.Show(); 
} 

EDIT:更新答え、新たな情報に

使用は基本的に、このないのであなたは、フォームの作成に使用して必要はありません。

try{ 
    SmsForm sm = new SmsForm(); 
    //some code 
} 
finally{ 
    sm.Dispose(); 
} 

を、私はそれが好きになるだろうこれは何か:

void ShowSms(object sender, EventArgs e) 
{ 
    SmsForm sm; 
    if (Globals.globals.Set.DBConn) 
    { 
    UnitOfWork uow = new UnitOfWork(); 
    sm = new SmsForm(uow);      
    } 
    else 
    sm = new SmsForm(); 
    if (sm.Visible) 
    sm.Focus(); 
    else 
    sm.Show(); 
} 

あなたのUnitOfWorkクラスには、Disposableオブジェクトを使用するクラス/メソッドのusingを使用するよりも、DB接続を開くなどの処理が必要なものがあります。

+0

を作成してみてください。しかし、私は "使用する"声明が必要な場合はどうすればいいですか? – AnotherSimpleName

+0

フォームを処分することを意味しますか?フォームがモーダルダイアログ( 'ShowDialog()')で呼び出されなかった場合は、終了時に処分する必要がありますので、使用しないとうまくいくはずです。この答えを見てください。http://stackoverflow.com/questions/3097364/c-sharp-form-close-vs-form-dispose –

+0

いいえ、私はフォームの2つの可能性があるため、フォームを実行するために "使用する"を使用しています。私はデータベース接続を持っている場合私はUnitOfWorkとフォームを実行している、私は持っていない、私はベースコンストラクタでフォームを実行しています。 – AnotherSimpleName

関連する問題