2009-08-10 21 views
1

メインフォームとフォームが2つのフォームで動作するプログラムを書いていますので、ユーザーがtoolstripmenu-> PreferencesをクリックするとPreferencesフォームが表示されますユーザは一度に1つのPreferencesフォームしか持つことができません。フォームを使って作業する

私が使用:

Prefs preferencias = new Prefs; 

    private void preferenciasToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     preferencias.Show(); 
    } 

それは動作しますが、私は環境設定フォームを閉じて、新しいものにプログラムがクラッシュを開こうとします。

そして、私が使用している場合:

private void preferenciasToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     Prefs preferencias = new Prefs; 
     preferencias.Show(); 
    } 

ユーザーは複数の環境設定フォームを肝炎することができます。

どうすればよいですか?

ありがとうございます。

答えて

5

):

private void preferenciasToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    preferencias.ShowDialog(); 
} 
1
preferencias.ShowDialog() 

は、1つの設定ウィンドウを開くことができます。あなたがモーダルダイアログをしたいようにあなたの代わりにショー(のにShowDialog()メソッドを使用する必要があるので、それは、聞こえる

0

あなたは、メニュー項目のクリックイベントにApplication.OpenFormsプロパティを使用することができますそのタイプのフォームがすでに開いているかどうかをチェックします。そのタイプのフォームが開いていない場合は、インスタンスを開くことができます。存在する場合、それは単に表示されません。

foreach (Form form in Application.OpenForms) { 
    if (form.GetType() != typeof(PreferencesForm)) { 
     new PreferencesForm().Show(); 
    } 
} 

それともとしては、すでにあなたは、ユーザーが彼らも再びメインフォームと対話することができます前に、フォームを閉じる必要があり、その場合には、フォームのモーダルを、作るためにPreferencesForm.ShowDialog()を呼び出すことができます述べました。

使用する方法は、ユーザーがプリファレンスフォームが開いていてもメインフォームを使用できるようにするかどうかによって異なります。

+0

これはちょっと後ろのようですが、環境設定ダイアログをモーダルにしたくない場合(それは明らかな選択肢のように見えます) –

+0

私のポストは最初の方法の裏に推論で更新されました。 –

0

1を探しているだけの場合は、PrefsクラスにSingleton patternを実装することをお勧めします。

+0

私は、OPがモーダルダイアログを必要としているだけで船外に出ていると思います。 –

2

他の人が示唆しているShowDialog()は良い答えです。これは何

private void FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (e.CloseReason == CloseReason.UserClosing) 
    { 
     e.Cancel = true; 
     Hide(); 
    } 
} 

は単純である、あなたは再びそれを示している場合、その既にメモリにロードされるようにフォームを非表示にします。あなたは、代替に興味があるなら、ここで私は時々やる何か。さらに、実行中のフォームにタイマーやその他のスレッドがある場合でも、そのスレッドは実行され、実行されます。

関連する問題