2011-07-30 12 views
6

私はForm1という形式を持っていますが、私はそれをモーダル形式としてForm2と表示しています。 Form2から私はForm2を閉じた後にForm1に反映されるべき様々な値のセットの編集と削除を行う。だから私がするのはForm2を閉じた後にRePopulateControls_in_Form1()です。 RePopulateControls_in_Form1()は長いプロセスなので、Form2に何らかの変更(編集、追加、削除)が発生し、Form2がオープンされ、閉じられていない場合にのみ、そのメソッドを実行したいと考えています。DialogResultはフォームを閉じませんか?

だから、これは私がForm1でやろうものです:私は、

のForm2で
 Form2 f = new Form2(); 
     if (f.ShowDialog(this) == DialogResult.Something) 
      RePopulateControls_in_Form1() 

そしてない

private void bntEdit() 
    { 
     //If Edit? 
     this.DialogResult = DialogResult.Something; 
    } 
    private void bntAdd() 
    { 
     //If Add? 
     this.DialogResult = DialogResult.Something; 
    } 
    private void bntDelete() 
    { 
     //If Delete? 
     this.DialogResult = DialogResult.Something; 
    } 

しかし、私の問題は.Somethingです。 .None以外の場合、Form2は単に閉じられます。私はForm2がユーザーがそれを閉じるまでそれ自身で単に閉じることを望まない。

私はこれを行う場合:

RePopulateControls_in_Form1()をヒットされていません!

私のプログラムでは、Form2に値が変更された場合のみ、RePopulateControls_in_Form1()を呼び出すようにコンパイラに指示することはできますか?

注:コントロールが動的に作成され、少し複雑(実際にはForm2で作成されるのはGUIコントロールとそのラベルなどです)ので、再挿入が必要です。

答えて

10

フォームのDialogResultを設定すると、フォームが非表示になり、ShowDialogから戻ります。フォームを閉じるなど、ユーザーが何らかの他のアクションを実行するまで、その状態をメンバフィールドとして保存し、DialogResultをForm.Closingのハンドラに設定する必要があります。

また、ボタンプレスでモーダルフォームを閉じたい場合は、Button.Clickハンドラを作成する代わりにButton.DialogResultプロパティを使用できます。

0

私は、フォーム2でイベントを使用します。そのイベントは、あなたのForm2が終了すると発生します。 Form1でそのイベントを処理することで、必要な処理を実行できます。さらに必要があれば、イベントのパラメータでForm2からForm1に情報を返すことができます。

代わりに、グローバル静的変数を設定することもできます(おそらく単なるbool)。 Form2は、変更が加えられたかどうかに応じてtrueまたはfalseに設定できます。 Form1は、Form2が返ってきたときにこれを読み取ることができ、trueであれば処理を実行し、falseに戻します。

+0

私は最初の部分を取得しますが、2番目のロジックは適切なコーディング手法ではありません! – nawfal

+1

なぜそうではありませんか?上記の場合、私はイベントを使用します。しかし、20の書式を持つアプリケーション全体で使用される値があり、その数の10倍の値がある場合、どのようにして1つの値しか使用されないようにしますか?フォームからフォームおよびクラスへの値をコンストラクタのパラメータまたはプロパティを介してクラスに渡すことをお勧めしますか? – ScruffyDuck

+0

これは、Form1にForm2について何か知らせるフラグを設定するだけの簡単なものです。なぜスレッドセーフではないグローバル変数ですか?上記のように220のクラスに渡って使用する必要がある場合、一般的なグローバル変数の重要性を理解しています。しかし、ここでは、アプリケーションのライフサイクル全体を通して眠っている静的変数をできるだけ避けるべきであるだけでなく、もっと重要なことに、私の簡単な質問から220の授業で雇用されるように大きい: – nawfal

2

簡単な方法として、DialogResultを使用するのではなく、フォームの動作を妨げない専用のプロパティを使用することができます。 - 次に、必要なロジックをプログラミングすることができます。

+0

ありがとう。それは私がやったことです。 – nawfal

+0

しかし、私は@ライアンラッセルがこのようなクールコールを持っていると思う。 – nawfal

関連する問題