Merhaba, C# Formlar Arası Veri Aktarımı konusunu daha önce C# Formlar Arası Veri Nasıl Gönderilir? yazımda 4 farklı yöntem ile açıklamıştım. Bu yazı sadece bir formdan diğer forma veri aktarma konusunda olacak. Bir dış etmen kullanmadan her şey Form’lar içinde olacak. Ne kadar detaya ineceğimi ben bile bilmiyorum. :D aklıma gelen her detayı yazmaya çalışacağım. Bana gelen sorulardan anladığım kadarı ile bu konuda sıkıntı yaşayan arkadaşlarımız oluyor. Bu sebeple bu konuyu biraz daha açıklamak istiyorum.
C# Formlar Arası Veri Aktarımı
Bu yazımda en çok kullanılan formlar arası veri aktarma başlıklarına bakacağız. Hayali bir projemiz olsun. bu projemizde 5 tane form olsun. Form1, Form2, Form3, Form4 ve Form5… Bu yazıyı okumaya başlamadan önce C# Erişim Belirleyiciler – Public, Private, Protected ve diğerleri bu yazımı okumanızı tavsiye ederim. Çünkü bu dersin ana teması bu yazıdaki erişim belirleyicilerdir.
C# Formlar Arası Değişken ile Veri Gönderme
C# Formlar arası değişken ile veri gönderme konusu en sık kullanılan yöntemdir. Genellikle 2 form arasında kullanılır. Şahsen ben en fazla 2 form arasında kullanılmasını tavsiye ediyorum. Elbette istisnalar yok değil.
Form1’den Form2’ye veri göndermek istiyorum. Form1’e bir button Form2’ye bir Label nesnesi ekledim. Yapmam gereken işlem sırası söyledir.
- Form 2 içerisinde bir public değişken tanımlarım.
- Form1’e gelir ve Form2’yi çağırırım. Form2’yi çağırırken Form2’deki public değişkene ulaşır ve göndermek istediğim veriyi gönderirim.
- Form2’nin load eventi içerisinde public değişkenin değerini Label nesnesinin text özelliğine gönderirirm. Yani gelen veriyi Label nesnesine yazarım.
From1 ve From2 kodları aşağıdaki gibidir.
using System; using System.Windows.Forms; namespace Uygulamam { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 fr = new Form2(); fr.Form2ye_Gidecek_Veri = "Form2'ye Gönderdiğim Veri"; fr.ShowDialog(); } } }
using System; using System.Windows.Forms; namespace Uygulamam { public partial class Form2 : Form { public Form2() { InitializeComponent(); } public string Form2ye_Gidecek_Veri = ""; private void Form2_Load(object sender, EventArgs e) { label1.Text = Form2ye_Gidecek_Veri; } } }
Form1’de yer alan Button nesnesine tıkladığımda Form2 açılacak ve Form2’deki Label nesnesinde “Form2’ye Gönderdiğim Veri“ yazılmış olacaktır… Aşağıda veri gönderme ile ilgili bir örnekten alınan görselleri görebilirsiniz.
Yukarıdaki örneği biraz daha genişletelim. Şimdide Form1’den Form2’ye aldığımız veriyi From2’den Form3’e gönderelim. Yani Form1’deki veriyi Form3’e göndermek istiyoruz. Form2’ye bir button, Form3’e bir Label ekledim. Yapmamız gereken işlemler sırası şöyledir.
- Form 3 içerisinde bir public değişken tanımlarım.
- Form2’ye gelir ve Form3’i çağırırım. Form3’ü çağırırken Form3’deki public değişkene ulaşır ve göndermek istediğim veriyi gönderirim.
- Form3’ün load eventi içerisinde public değişkenin değerini Label nesnesinin text özelliğine gönderirirm. Yani gelen veriyi Label nesnesine yazarım.
From1, From2 ve Form3 kodları aşağıdaki gibidir.
using System; using System.Windows.Forms; namespace Uygulamam { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 fr = new Form2(); fr.Form2ye_Gidecek_Veri = "Form2'ye Gönderdiğim Veri"; fr.ShowDialog(); } } }
using System; using System.Windows.Forms; namespace Uygulamam { public partial class Form2 : Form { public Form2() { InitializeComponent(); } public string Form2ye_Gidecek_Veri = ""; private void Form2_Load(object sender, EventArgs e) { label1.Text = Form2ye_Gidecek_Veri; } private void button1_Click(object sender, EventArgs e) { Form3 fr = new Form3(); fr.Form3e_Gidecek_Veri = Form2ye_Gidecek_Veri; fr.ShowDialog(); } } }
using System; using System.Windows.Forms; namespace Uygulamam { public partial class Form3 : Form { public Form3() { InitializeComponent(); } public string Form3e_Gidecek_Veri = ""; private void Form3_Load(object sender, EventArgs e) { label1.Text = Form3e_Gidecek_Veri; } } }
İkiden fazla formda bu yöntemi kullandığımızda giderek karmaşık hale geldiğini görebiliyoruz. Bazen istisnai durumlarda kullanabiliriz ancak bir veriyi proje genelinde kullanmak istiyorsak yöntem kesinlikle bu değildir. Düşünün birbirlerinin içinde 5 tane form açtığınızı… Yani Form1’den Form2’yi, Form2’den Form3’ü oradan Form4’ü oradan Form5’i bu şekilde ondan onda, ondan ona veri aktarımı yapmak sizce mantıklı mı? Kararı siz verin.
Bu bölümde her ne kadar değişken olarak bahsetmiş olsak da c# formlar arası dizi aktarma işlemi de yapabiliriz. Dizi, List<T>, DataTable, vs herhangi türden nesnenin transferinin yapabiliriz. Sadece veriyi alacak olan Form içerisinde aynı türden bir nesne tanımlanmış olması gerekmektedir.
C# Formlar arası değişken ile veri gönderme konusunu hallettiğimize inanıyorum.
C# Formlar Arası Nesne ile Veri Gönderme
C# Formlar arası değişken ile veri gönderme konusunu hallettiğimize göre bu işlemi bir nesne üzerinden tekrar yapalım. Değişkenleri Public yapabiliyoruz. Peki nesneler? Elbette nesneleri de Public yapabiliriz. Forma eklenen bir nesne varsayılan olarak Private (Özel) olarak eklenir.
Başka formdan erişmek istediğiniz nesne üzerinde sağ tık yapın ve Properties (Özellikler) diyin. Özellikler penceresi açıldıktan sonra o pencerede Modifiers özelliğini bulun ve oradan Public ‘i seçin. Bununla birlikte o nesne artık başka formlardan erişilebilir hale gelecektir. C# Formlar arası değişken bölümündeki aynı örnek üzerinden gideceğim.
Form2’deki Label nesnesinin Modifiers özelliğini Public olarak ayarladım. Form2’de yapılacak tek şey Label nesnesinin Modifiers özelliğini Public yapmaktı. Form2’de başka bir işimiz kalmadı. Böylece artık Form1’den Form2’yi çağırırken direk olarak Label nesnesine erişebilir ve bir değişken yerine direk Form2 üzerindeki Label nesnesinin Text özelliğine istediğimizi yazabiliriz.
using System; using System.Windows.Forms; namespace Uygulamam { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 fr = new Form2(); fr.label1.Text = "Form2'ye Gönderdiğim Veri"; fr.ShowDialog(); } } }
Form1’den aldığınız ve Form2’ye gönderdiğiniz veriyi, Form2’den Form3’e veri göndermek istediğinizde de aynı işlemi yaparsınız. Form3 üzerindeki bir nesnenin Modifiers özelliğini Public yaparsınız ve Form3’ü çağırırken Modifiers özelliğini Public yaptığınız nesnenin Text özelliğine Form3’ü çağırırken yazadırırsınız.
C# Formlar Arası Nesne Kontrolü
Bu yöntemlerle birlikte C# formlar arası nesne kontrolü de yapabiliriz. Public yaptığımız bir nesnenin özelliklerini de başka bir Form üzerinden değiştirebiliriz. Yukarıdaki örneği göz önüne alalım. Form3 içindeki Public Label nesnesinin Text Özelliğini değiştirdik. Text ‘de bir özellik olduğuna göre o Label’in tüm özelliklerine de ulaşabiliriz ve değiştirebiliriz.
C# Formlar Arası Nesne Aktarma
Belki ihtiyacınız olur diye bu konuyu da anlatmak istiyorum. Olur da, bir Form’dan diğerine veri değil de bir nesnenin kendisini aktarmak isterseniz aşağıdaki yöntemi kullanabilirsiniz.
Bu yöntem de Form1 üzerindeki bir Button nesnesini tamamen Form2’ye göndereceğiz. Yani Button nesnesi Form1’den kaybolacak Form2’ye gönderilecek. Tam bir formlar arası nesne aktarma olacak. Aktarma yapıldığında, Button nesnesinin kendisi aktarıldığından dolayı Name, Text, Size, Location özellikleri değişmeyecektir. Aktardığınız nesne Form1’de formun tam olarak neresindeyse Form2’ye geçtiğinde de tam olarak aynı yerde olacak.
using System; using System.Windows.Forms; namespace Uygulamam { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 fr = new Form2(); fr.Controls.Add(button1); fr.ShowDialog(); } } }
fr.Controls.Add(); metodu ile Form1 üzerindeki button1 nesnesi Form2’ye taşınacaktır. Dikkat! Kopyalanma değil Taşınma!
C# Formlar Arası Metot Çağırma
Geriye değer dönen metotları düşündüğümüzde yukarıdaki yöntemle aynı şekilde C# formlar arası metot çağırma yapabilirsiniz. Sadece metodun Public olduğundan emin olmalısınız. Form3’ü açmadan sadece Form3’teki string değer döndüren metodu kullanacağız.
Form3’de yer alan bir Public metodu Form1’de nasıl kullanacağımıza bakalım.
using System; using System.Windows.Forms; namespace Uygulamam { public partial class Form3 : Form { public Form3() { InitializeComponent(); } private void Form3_Load(object sender, EventArgs e) { } public string Form3_Metodu() { return ""; } } }
using System; using System.Windows.Forms; namespace Uygulamam { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form3 fr = new Form3(); string s = fr.Form3_Metodu(); } } }
Ancak bu yöntemi önermiyorum. Eğer bir metodu farklı Form’lar içerisinde kullanmanız gerekiyorsa, o kodların bir Class dosyası içerisine alınma zamanı gelmiş demektir. ;)
Eveeeeet! Buraya kadar bir Form ‘dan başka bir Form’u açarken veri göndermeyi gördük. Peki zaten açmış olduğumuz bir formu kapatırken, açık olan formdan elde ettiğimiz veriyi arkadaki forma nasıl göndereceğiz? Yani form açarken değil formu kapatırken veri göndereceğiz.
C# Form Kapanırken Veri Gönderme
C# form kapanırken veri gönderme işlemi de sık sık lazım olan bir işlemdir. Örnek bir senaryo vermem gerekirse;
Personel listesi formundaki bir Button nesnesi ile personel ekleme formunu açalım. Personel eklendikten sonra eklediğimiz personelin ID bilgisini alalım ve personel listesi formuna gönderelim. Tabi burada sadece veri gönderme noktasına bakacağız.
Form2 kapanırken Form1’e veri göndereceğiz. Burada yukarıdaki yöntemlerden istediğinizi kullanabilirsiniz. Yani ister Public Değişken ile ister Public Nesne ile yapın. Karar size kalmış. Ben örneği Public Değişken üzerinden yapacağım.
NOT: Bu işlem için Form2’nin ShowDialog() ile açılmış olmak zorundadır. Eğer Show() ile açarsanız bu yöntem çalışmayacaktır. Deneyip görebilirsiniz.
using System; using System.Windows.Forms; namespace Uygulamam { public partial class Form2 : Form { public Form2() { InitializeComponent(); } public int personel_ID = 0; private void button1_Click(object sender, EventArgs e) { // personel kaydetme ve ID alma işlemlerini yapmış olun. // eklenen personelin ID 'si 256 olsun. personel_ID = 256; Close(); } } }
Personel ekleme işlemini yaptık. ID bilgisini 256 olarak aldık. Alınan ID değerini aynı form içindeki Public değişkene atadık ve Form2’yi kapattık.
using System; using System.Windows.Forms; namespace Uygulamam { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 fr = new Form2(); fr.ShowDialog(); // Bu yöntem için ShowDialog() mutlak gerekliliktir. int eklenen_Personel_ID = fr.personel_ID; } } }
Form2 kapandıktan sonra From1’de Form2 ‘deki Public değişkene ulaşabiliyoruz.
Buradaki ShowDialog() şartını merak edenler için açıklayayım.
Fark etmişsinizdir. Bir Form üzerinde başka bir Form’u ShowDialog() ile açtığınızda, arkada kalan Form’a tıklamak istediğiniz de tıklamanıza izin vermez. Alt+Tab gibi ekranlar arasında dolaşmanızı sağlayan işlemlerle de alttaki Forma geçemezsiniz. Bu tüm Dialog() pencereleri için geçerlidir. OpenFileDialog(), SaveFileDialog(), FontDialog() ColorDialog() gibi Dialog() olarak açılan hiçbir ekran kapanmadan alttaki formlara geçişe izin vermez.
Bu sebeple alttaki Formdaki kodlar ShowDialog()’da beklemeye alınır. Yukarıdaki örneğe baktığımzıda Form2 ShowDialog() ile açıldığı için kodlar o noktada Form2 üzerindeki işlemlerin tamamlanmasını yani formun kapanmasını bekler. Form kapandıktan sonra kodlar çalışmaya devam eder. Böyle olduğu için, PersonelID Public değişkenine atamış olduğumuz veriyi Form1’den elde edebiliyoruz.
Eğer Form2’yi Show() ile açmış olursak, kodlar beklemeyecek ve devam edecektir. Bu yüzden Form2’den gelen değer her zaman boş olacaktır. Çünkü Public değişkene değer atanmadan önce button_click eventi içindeki kodların hepsi çalıştırılmış olacak. Form2’i kapandığında çalışacak bir kod kalmamış olacak.
C# Formlar Arası Veri Aktarımı dersi de bu kadarı arkadaşlar. Umarım faydalı olmuştur. Aklıma gelen her türlü detayı vermeye çalıştım. Eğer aklınıza takılan bir nokta olursa yorum atmaktan çekinmeyin.
C Sharp Eğitim Seti eğitimi sayfasına gitmek için tıklayınız. Derslerime özel olarak hazırladığım Github Projeme bu bağlantıdan ulaşabilirsiniz…
Sağlıcakla ve takipte kalın.