2012-03-18 3 views
1

フォームをMDICHILDフォームとして使用するために、次のコード全体を書く必要がないように、次のコードの関数を作成するにはどうすればよいですか。mdiコンテナの関数を作成する方法

Students stu = null; 
private void studentsToolStripMenuItem1_Click(object sender, EventArgs e) 
{ 
    if (stu == null || stu.IsDisposed) 
    { 
    stu = new Students(); 
    stu.MdiParent = this; 
    stu.Show(); 
    } 
    else 
    { 
    stu.Activate(); 
    } 
} 
+0

をあなたがするよう手の込んだていただけます何が問題なの? –

+0

私のアプリケーションには10のフォームがあります。 mdiの子フォームとしてmdiのparantフォームで使用するすべての単一のフォームのための上記のコードを心配する必要があります私はそれを私のmdicontainerのmdiの子として使用するためにすべての子フォームで使用できる関数をしたい –

答えて

2

この

private void CreateMdiChild<T>(ref T t) where T : Form, new() 
{    
    if (t == null || t.IsDisposed) 
    { 
     t = new T(); 
     t.MdiParent = this; 
     t.Show(); 
    } 
    else 
    { 
     if (t.WindowState == FormWindowState.Minimized) 
     { 
      t.WindowState = FormWindowState.Normal; 
     } 
     else 
     { 
      t.Activate(); 
     } 
    } 
} 

使用してみてください。

Students students; 
private void studentsToolStripMenuItem1_Click(object sender, EventArgs e) 
{ 
    CreateMdiChild<Students>(ref students); 
} 
0

シングルトンクラス/フォームとして利用学生:

public class Students: Form 
{ 
    private static Students _Self; 
    public static Students ShowOrActivate(Form parent) 
    { 
     if (_Self == null) 
     { 
      _Self = new Students(); 
      _Self.MdiParent = this; 
      _Self.Show(); 
     } 
     else 
      _Self.Activate(); 
    } 
} 

は、今あなたが持っているコードには本当に何も悪いことはありません

private void studentsToolStripMenuItem1_Click(object sender, EventArgs e) 
{ 
Students.ShowOrActivate(this); 
} 
+0

Florianありがとうあなたも少なくともあなたを助けようとしました..しかしおそらく質問をするための私のデモンストレーションはあなたが理解するのに十分ではありませんでした –

5

でフォームを表示します。あなたは反射のビットと、それはDRY作ることができます。

public Form CreateMdiChild(Type type, bool singleton) { 
     if (singleton) { 
      foreach (var child in this.MdiChildren) { 
       if (child.GetType() == type) { 
        child.WindowState = FormWindowState.Normal; 
        child.Show(); 
        child.Activate(); 
        return child; 
       } 
      } 
     } 
     Form form = (Form)Activator.CreateInstance(type); 
     form.MdiParent = this; 
     form.Show(); 
     return form; 
    } 

は使用方法:

CreateMdiChild(typeof(Students), true); 
+0

とても素敵なHans Passant。 Thnaks Alot。私はこれを試してみました。 –

+0

他の場合は機能しません。たとえば、フォームが既にmdiコンテナに開かれている場合は、ボタンが押されたときにフォームをアクティブにする必要があります –

+0

このコードを投稿する前にそのシナリオをテストしました。シングルトン引数にtrue *を渡していますか? child.Activate()を追加すると、より明示的にすることができます。 –

関連する問題