2011-05-19 15 views
0

メニューを含むMDIParentウィンドウフォームを使用しています。同じメニューを再度クリックすると、新しいウィンドウが開きます。それが既に開いている場合は、ウィンドウを再オープンするのを止める方法は?クリックするたびにウィンドウフォームが表示されるべきではありません。C#を使用してクリックして再び開くためにウィンドウフォームを停止する方法は?

+6

あなたは)(そのメニュー項目のクリックでコードを表示することができますか?私はイベントハンドラが呼び出されるたびにそのFormオブジェクトを再作成するためだと思います。 –

+1

このような問題をコードなしでデバッグすることはできません。私はそれを見るために画面の近くに座っていません。質問を編集して、MDIParentフォームの 'Click'イベントハンドラメソッドを追加してください。 –

答えて

1

2つの方法:

ウェイ1、フラグ:
フラグ(またはフラグのリスト)を保持開放形態について。
フォームを開く(新しい()を作成する)たびに、フラグを "true"に設定します。
フォームが閉じると、フラグをfalseに設定します。
ボタンのクリックイベントで、フラグをチェックして、フォームを新規作成する前に開いているかどうかを確認します。

ウェイ2、参照を保持:
あなたが使用しているすべてのフォームにメインフォームで参照してください。
フォームが開いていない場合は、nullとして初期化します。
新しいフォームを開くと、そのフォームへの参照が設定されます。
ボタンのクリックイベントで、新しいイベントを作成する前にフォームの参照がnullかどうかを確認します。

私は第2の方法を好みます。すべてのサブフォームへの参照がある場合は、リソースを簡単に制御できます。

0

開いているフォームのリストを維持したり、onClickイベントのリストをチェックしたり、フォームを開いたときにメニューアイテムを無効/有効にしたりできます。

2

Application.OpenFormsプロパティを使用してください。

Boolean found = 
    Application.OpenForms.Cast<Form>().Any(form => form.ID == "TargetFormID" 

if (!found) 
{ 
    // Open a new instance of the form // 
} 
+1

+1:私はこのプロパティが存在することを知らなかった! – Nick

+0

@ニック:あなたはあまり失っていませんでした。かなり悪い習慣を奨励します。実際には、作成されたフォームの各インスタンスへの参照を維持しておき、一致を探してこのコレクションを歩いてはいけません。 –

+0

実際には(少なくともある種の状況では)それはフォームの名前にも索引付け可能なので、かなり良い方法のように見えます。 – Nick

0

別の理由は、使用するデフォルトのインスタンスを保持するFormPropertyを作成することです。

private static Form _defaultInstance; 
public static Form DefaultInstance() 
{ 
    get { 
     if(_defaultInstance == null || _defaultInstance.IsDisposed) 
     { 
      _defaultInstance = new yourTypeHere(); 
     } 

     return _defaultInstance; 
    } 
} 

そして今、あなたは、常にこのプロパティを介して、あなたのウィンドウにアクセス:

yourTypeHere.DefaultInstance.Show(); 
関連する問題