2012-01-16 25 views
3

に移動し、子フォーム「B」を呼び出すために、次のコードがあります:同じ形式で親フォームのAでは、子フォームからその兄弟フォーム

 Window frmChildB; 
     frmChildB = new FormB(); 
     frmChildB.ShowDialog(); 

:子を呼び出すために、次のコードは、フォーム「C」:

 Window frmChildC; 
     frmChildC = new FormC(); 
     frmChildC.ShowDialog(); 

は、今私は私がそのボタンをクリックした場合、それは自動的にフォームのCの参照オブジェクトを使用してC.

を形成するために移動するように、フォームBでボタンを作りたいですこの0の答えのような形B可能であれば、は避けるべきです。理由は、B、C ...のような10以上のフォームがあり、それぞれが別のフォームにナビゲートできる必要があるということです。フォーム内に10個のフォーム参照オブジェクトを持つことは、良くありません。

私はその効果を達成するには何らかの方法が必要だと思います。誰がこれについて知っていますか?

+0

'Form.ShowDialog'はモーダルダイアログを表示します。これはあなたが投稿したコードの問題のようです。 'FormB'がモーダルで表示されている場合は、' FormC'を表示する前に*非アクティブ化する必要がありますので、なぜ 'Form.Show'を使わないのでしょうか? –

+0

@ M.Babcock:アプリケーションでは、ユーザーが子フォームを閉じずにメインフォームに戻ることができないためです。別の言い方をすると、ユーザーは一度にフォームでしか作業できません。 –

+1

なぜあなたは別のフォームを使用していますか?フレームやユーザーコントロールがうまくフィットしないでしょうか? –

答えて

1

でそれをConsumming形成しますフォームを作成し、それらの間を行き来するだけです。

これが望ましい場合は、フォームのインスタンスを作成し、必要に応じてそれらを表示する静的FormManagerクラスを実装できます。複雑さをさらに減らすためにenumを使用することもできます。ここで

は、このクラスの例である(それはいくつかの追加作業が必要になりますが、あなたに良いアイデアを与える必要があります):

FormManager.ShowForm(FormManager.FormId.FormB); 

public class FormManager 
{ 
    private static FormB m_FormB; 
    public static FormB formB 
    { 
     get 
     { 
      if (m_FormB == null) 
      { 
       m_FormB = new FormB(); 
      } 
      return m_FormB; 
     } 
    } 
    private static FormC m_FormC; 
    puClic static FormC formC 
    { 
     get 
     { 
      if (m_FormC == null) 
      { 
       m_FormC = new FormC(); 
      } 
      return m_FormC; 
     } 
    } 

    public enum FormId 
    { 
     FormB, 
     FormC 
    } 

    public static Form ShowForm(FormId whichForm) 
    { 
     Form oForm; 

     switch (whichForm) 
     { 
      case FormId.FormB: 
       oForm = FormManager.formB; 
       break; 

      case FormId.FormC: 
       oForm = FormManager.formC; 
       break; 

      default: 
       oForm = null; 
       break; 
     } 

     if (oForm != null) 
     { 
      oForm.ShowDialog(); 
     } 
     return oForm; 
    } 
} 

これは、次のように子フォームから呼び出すことができます

+0

ありがとう、私はこれを実装しようとします。 –

+0

このように良いです。しかし、子フォームを閉じた後、再度開いてみると、「ウィンドウが閉じた後に、可視性を設定したり、ShowまたはShowDialogを呼び出すことができません」というエラーが表示されます。子フォームを閉じてメインウィンドウに戻ります。 –

+0

私はようやくこのアプローチを使用します –

1

frmChildBでイベントを作成し、それを親で購読してみてください。 frmChildBのfrmChildCへの参照を持たずに、あなたが望むことをすることができます。


このMSDNをご覧くださいlink;

これは非常にですが、わかりやすいはずです。子でイベントを作成

は私が正しくあなたの質問を理解していれば、あなたはそれぞれの単一のインスタンスを持ちたい

public delegate void SwapEventHandler(object sender, EventArgs e); 
public partial class Form2 : Form 
{ 
    public event SwapEventHandler Swap; 

    public Form2() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Swap(sender, e); 
    } 
} 

が親フォーム

private void button1_Click(object sender, EventArgs e) 
{ 
    frmChildB = new Form2(); 
    frmChildB.Name = "frmChildB"; 
    frmChildB.Swap += new SwapEventHandler(frmChildB_Swap); 
    frmChildB.ShowDialog(); 
} 


private void frmChildB_Swap(object sender, EventArgs e) 
{ 
    frmChildB.Swap -= new SwapEventHandler(frmChildB_Swap); 
    frmChildB.Close(); 
    frmChildB.Dispose(); 
    frmChildB = null; 
    frmChildC = new Form2(); 
    frmChildC.Name = "frmChildC"; 
    frmChildC.Swap += new SwapEventHandler(frmChildC_Swap); 
    frmChildC.ShowDialog(); 
} 

void frmChildC_Swap(object sender, EventArgs e) 
{ 
    frmChildC.Swap -= new SwapEventHandler(frmChildC_Swap); 
    frmChildC.Close(); 
    frmChildC.Dispose(); 
    frmChildC = null; 
    frmChildB = new Form2(); 
    frmChildB.Name = "frmChildC"; 
    frmChildB.Swap += new SwapEventHandler(frmChildB_Swap); 
    frmChildB.ShowDialog(); 
} 
+0

です。これは初心者の質問ですが、申し訳ありませんが、あなたの答えはまだ分かりません。チュートリアルやサンプルソースコードのような参考資料を私に指摘してもらえますか? –

0

基本的なレベルでは、各質問に対して別々のフォームを使用するよりも、標準的な「ウィザード」パターンを使用するほうが恩恵を受けるようです。例外的に、典型的な次と戻るボタンを持つ代わりに、いずれかの質問にジャンプするボタンが必要です。 Here is a good tutorialをクリックすると、ウィザードを作成する通常の手順が表示されます。

関連する問題