2012-03-26 11 views
0

次のコード用の関数を作成すると、フォームを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(); 
     } 
    } 

私はこの

public void CreateMdiChild(Form form) 
    { 
     //expected code    
    } 

答えて

2

ようにする必要があり、この

private void studentsToolStripMenuItem1_Click(object sender, EventArgs e) 
    { 
     CreateMdiChild(Students); 
    } 

と関数のようにそれをしたいしながら、あなたは方法は、一般的な作ることができ、例えば:

public void CreateMdiChildOrActivate<T>(ref T instance) where T : Form, new() 
{ 
    if (instance == null || instance.IsDisposed) 
    { 
     instance = new T(); 
     instance.MdiParent = this; 
     instance.Show(); 
    } 
    else 
    { 
     instance.Activate(); 
    } 
} 

使用法:

private void studentsToolStripMenuItem1_Click(object sender, EventArgs e) 
{ 
    CreateMdiChildOrActivate(ref this.stu); 
} 

EDIT:

あなたが各フォームのクラスフィールドを作成したくない場合は、この方法で行うことができます。

各フォームタイプのオープンフォームを含むクラス辞書フィールドを作成します。

private Dictionary<Type,Form> openForms = new Dictionary<Type,Form>(); 

その後に従来の方法に変更します。

private void studentsToolStripMenuItem1_Click(object sender, EventArgs e) 
{ 
    CreateMdiChildOrActivate<Student>(); 
} 
+0

が@kashif:申し訳ありません

public void CreateMdiChildOrActivate<T>() where T : Form, new() { Form instance; openForms.TryGetValue(typeof(T), out instance); if (instance == null || instance.IsDisposed) { instance = new T(); openForms[typeof(T)] = instance; instance.MdiParent = this; instance.Show(); } else { instance.Activate(); } } 

今、あなたはこのようにそれを呼び出すことができます私は理解していない... yパラメータを渡すことなくこのメソッドを呼びたいのですか? – digEmAll

+0

@kashif:あなたが正しくあなたを理解していれば、Stuというクラスフィールドを作成するのではなく、フォームの型だけを渡すことで、メソッドに渡すことができます。私の編集をチェックして、あなたが望むものを望む... – digEmAll

+0

@kashif:彼らはどちらも良いですが、3つ以上のフォームがあれば2番目のフォームはおそらくより良いでしょう。フォームのフィールドの多く。一方、2番目のケースでは、フォームタイプごとにフォームのインスタンスを1つしか使用できません(たとえば、1つのStudentフォームしか使用できません)...しかし、私はそれがあなたが望むものだと思います... – digEmAll

0
public void CreateMdiChild<T>(Form f) where T : Form, new() 
{ 
    foreach (Form frm in f.MdiChildren) 
    { 
     if (frm.GetType() == typeof(T)) 
     {       
      if (frm.WindowState == FormWindowState.Minimized) 
      { 
       frm.WindowState = FormWindowState.Normal; 
      } 
      else 
      { 
       frm.Activate(); 
      } 
      return; 
     }      
    } 
    T t = new T(); 
    t.MdiParent = f; 
    t.Show(); 
} 

使用

CreateMdiChild<MyForm>() 
関連する問題