MDI Form etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
MDI Form etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

28 Mart 2016 Pazartesi

C# MDI Form Kullanımı

Merhabalar,
Bugün sizlere Visual Studio üzerinde MDI Form yapsını anlatmaya çalışacağım.

Bildiğiniz üzere Classic Form yapısında Form'lar birbirinden bağımsız olarak minimize ve maximize edilemez. Birbirinden bağımsız olarak boyutlandırılabilir ve her birinin taskbar üzerinde bir görünmü mevcuttur. MDI Form'da ise form içini açılan child form'lar mevcuttur ve minimize ve maximize işlemleri bu form içinde olacaktır. Aşağıda gördüğünüz gibi.


Öncelikli olarak bu uygulama için Visual Stdio üzerinden New > Project adımlarını izleyerek Windows Form Application oluşturunuz.


Daha sonra projenize MDI Parent Form ekleyip ismini MainForm olarak belirleyiniz. Menu'deki fazlalıkları silip aşağıdaki yapıyı kurunuz. Ek olarak template gelen fazla toolbar ve code behind tarafında fazla kodları siliniz.


Daha sonra Sub Form ve Sub Form 2 item değerlerleri için Click olaylarını item'lar üzerine double click ile tıkladıktan sonra aktif hale getiriniz. Projenize bir Forms klasör açıp içerisine SubForm ve SubForm2 formlarını oluşturunuz.

Bu işlemlerden sonra asıl kodlamaya geçebiliriz. Açılan formların tek bir yerden yönetilmesi için ben Dictionary kullanmaya karar verdim. Bununla birlikte her form için koşul yazmaktansa Activator.CreateInstance method'unu kullanarak form'larn dinamik olarak instance'sini aldım.

Daha etkin olması açısında video'yu da izleyebilir siniz?



MainForm'un içerisine yazmanız gereken kodlar aşağıdaki gibidir.
public partial class MainForm : Form
{
 public MainForm()
 {
  InitializeComponent();
  this.ActiveForms = new Dictionary<Type, Form>();
 }
 private Dictionary<Type, Form> ActiveForms;
 private void subFormToolStripMenuItem_Click(object sender, EventArgs e)
 {
  this.ShowForm<Forms.SubForm>();
 }
 private void subForm2ToolStripMenuItem_Click(object sender, EventArgs e)
 {
  this.ShowForm<Forms.SubForm2>();
 }
 private void ShowForm<TSource>() where TSource : Form
 {
  Form form = null;
  if (this.ActiveForms.ContainsKey(typeof(TSource)))
  {
   form = this.ActiveForms[typeof(TSource)];
   form.WindowState = FormWindowState.Normal;
   form.Activate();
  }
  else
  {
   form = Activator.CreateInstance<TSource>();
   form.MdiParent = this;
   form.FormClosed += form_FormClosed;
   form.Show();

   this.ActiveForms.Add(typeof(TSource), form);
  }
 }
 private void form_FormClosed(object sender, FormClosedEventArgs e)
 {
  this.ActiveForms.Remove(sender.GetType());
 }
}