C# Formlar Arası Veri Aktarımı

Ağustos 10, 2016 Mustafa BÜKÜLMEZ 0 Yorum



Merhabalar arkadaşlar,

Bunu önceki makalelerimin birinde üstün körü anlatmıştım.Şimdi ise derinlemesine göz atalım.

Bunun için bir çok yol mevcut en kullanışsınızdan başlayalım :D

1. YOL - SQL ile
Bu işlemi SQL kullanarak yapabilirsiniz. Ama buna ayrıntı vermeyeceğim. Bunun tek kullanım yeri iki farklı exe dosyası arasında veri göndermek istediğinizde kullanırsınız. Örn aynı proje içerisindeki Ana uygulamadan yan uygulamaya veri göndermek isterseniz bu yöntemi kullanabilirsiniz. Zaten başka yerde kullanmazsınız. Çok mantıksız olur.


2. YOL - Form Açıp/Kapatırken
Bu işlemi çok sık kullanırız.

1. Formu Açarken Veri Gönderme
   2 formumuz olsun 1. formun adı " AnaMenu " 2. formun adı da " KayıtEkranı " olsun.
   İlk yapacağımız işlem KayıtEkranı  formunda bir public değişken açmaktır.
   Örn: Public int RECno = 0;

   Şimdi AnaMenu formundan KayıtEkranı formuna bir RECno gönderelim ve AnaMenu formuna
   eklediğimiz butonun click eventine şu kodları yazalım.

   KayıtEkranı  fr =  new KayıtEkranı();
   fr.RECno  = AlınanRECno;
   //bu değişken AnaMenu formunda tanımlanan normal bir değişken. Yani Public değil
   fr.ShowDialog();

   Evet bu şekilde AnaMenu formundan KayıtEkranı formuna veri aktarmış olduk. KayıtEkranı
   formuna ekleyeceğiniz bir label'in text'ine değişkenin değerini atasanız alınan veriyi göreceksiniz.

   KayıtEkranı formunun Load Eventi içerisine bu kodu yazarak kontrol edebilirsiniz.

   Label1.Text = RECno  .ToString(); 
   // değişken int olduğu için " .ToString(); " ile convertlememiz gerekir.

2. Formu Kapatırken Veri Gönderme
   Senaryomuz 1. madde ile aynı olsun.
   AnaMenu formuna eklediğimiz butonun click eventine
   şu kodları yazıyoruz.

   KayıtEkranı  fr =  new KayıtEkranı();
   fr.ShowDialog();
   AlınanRECno =   fr.RECno;

  Aldığımız veriyi labelde gösterelim
  Not: KayıtEkranı formu açıldığında RECno değişkenine değer atadıktan sonra formu kapatıyoruz. yoksa yaptığımızın bir anlamı kalmaz. Yani hiç atama yapılmadığı için boş döner.

  Label1.Text = AlınanRECno.ToString(); 
   // değişken int olduğu için " .ToString(); " ile convertlememiz gerekir.
yada
  Label1.Text = fr.RECno.ToString(); 
   // değişken int olduğu için " .ToString(); " ile convertlememiz gerekir.
   // hiç fark etmez istediğinizi kullanabilirsiniz. ama birinciyi tercih ediyorum.
Genel olarak 2 maddeye göz attığımızda aradaki farkı anlıyoruz sanırım.


3. YOL Class Kullanarak
2. yol ile birlikte bu yolu dah çok sık kullanırım. Kendimden örnek vererek anlatayım. Kendime bir GlobalSystem adında bir class açtım ve sadece değişken göndermek için kullanıyorum. Class tanımlayı bu makalemde görebilirsiniz.

Kullanma amacımda şudur. Kullanıcı giriş formunda giriş başarılı ise Kullanıcı Kodu, Kullanıcı Adı, Kullanıcı Yetkileri vs gibi bilgileri bu class a atarım. Program kapanana kadar o kodları kullanırım. Bunu yapmamış olsaydım her seferinde sqlden veri çektirmek zorunda kalırdım ki bu performansı kötü etkiler.

Bunu Nasıl yapıyorum pekiiii ona bir bakalımm..

Class'ı açtıktan sonra içerisinde bunları ekleyelim.

public static string AppPath = System.Windows.Forms.Application.StartupPath;                                  
public static string AktifKullaniciAdi = "";
public static string AktifKullaniciKodu = 0;
public static string AktifKullaniciSifre= "";

Hmm. Şimdi burada bir kaç farklı şey var onlara bakalım. Mesela " AppPath ",

Arkadaşlar " System.Windows.Forms.Application.StartupPath; " Visual Studio da F5 tuşuna basıp derlemeyi yaptığınızda programın oluşturduğu EXEdosyasının(projenizin EXE'si) yoludur. Ayarları değiştirmediyseniz proje dosyasının içerisindeki Bin/Debug klasörünün içerisinde olur.   Kaldı ki ayarları değiştirdiniz ve başka klasöre aktardınız. Bu seferde o klasörü gösterir. Kısacası EXE dosyası hangi klasörde ise o klasörün içine bakar bu kod.                            

NOT: Arkadaşlar programlama " BOŞ " olayı biraz farklıdır. Yukarıdaki " *="" " daki "" aslında boş değildir. Yani programa göre boşluk da bir karakterdir ve ASCII kodlarında yeri vardır. Programlama dillerinde " NULL " boş anlamına gelir.

AktifKullaniciAdi  = null; 
//bu şekilde yaparsak programa göre boştur.

Şimdi..
KullanıcıLogin Formundaki giriş butonunun click eventine atama kodlarımızı yazalım.

GlobalSystem.AktifKullaniciAdi  = TXT_Kullanici_Adi.Text;
GlobalSystem.AktifKullaniciKodu = Convert.ToInt32(TXT_Kullanici_Kodu.Text);
GlobalSystem.AktifKullaniciSifre = TXT_Kullanici_Sifre.Text;
//Bu şekilde de class in içerisindeki değişkenlere bu verileri atamış olduk. Artık proje genelinde istediğimiz heryerde bunları kullanabiliriz.

Örn bir SQL insert içerisinde kullanımına bakalım. (sadece sorgusunu yazacağım.)


INSERT INTO PERSONELLER 
(
//Diğer Kolonlar
, Kaydeden
, KayitTarihi
)
VALUES
(
//Diğer Kolonlar
, " + GlobalSystem.AktifKullaniciAdi + "
, Getdate() //SQL serverin bulunduğu pcnin saatini alır ve kaydeder..
)

Bu SQL Sorgu düzenini de herkes bilmez haa ou da söylim :D Normalde herkes yan yana yazar gider ;)
Kendi SQL class ımı kullanarak size bir örnek göstereyim :D
 SQL.CommScalar("INSERT INTO [URUN_TANIMLARI] "
      + "  ([Urun_Adi]"
      + "  ,[Urun_Turu]"
      + "  ,[Urun_Fiyati]"
      + "  ,[Urun_Maliyeti]"
      + "  ,[Urun_AnaGrup_RECno]"
      + "  ,[Urun_OrtaGrp_RECno]"
      + "  ,[Urun_Resmi]"
      + "  ,[Kayit_Tarih]"
      + "  ,[Urun_Ozel_Mi]"
      + "  ,[Kaydeden]"
      + "  ,[Aktif])"
      + " VALUES "
      + "  ('" + TXT_URUN_ADI.Text.ToUpper()+ "'" // toupper() daima büyük harf 
      + "  ," + CAL_URUN_TURU_KOD.EditValue + "" // devexpress calcedit nesnesi
      + "  ," + CAL_SATIS_FIYAT.EditValue + ""
      + "  ," + CAL_URUN_MALIYET.EditValue + ""
      + "  ," + CAL_URUN_ANA_GRUP_KOD.EditValue + ""
      + "  ," + CAL_URUN_ORTA_GRUP_KOD.EditValue + ""
      + "  ,'' "
      + "  ,getdate()"
      + "  ,0"
      + "  ," + GlobalSystem.aktif_kullanici_kodu + ""
      + "  ," + Convert.ToInt32(CHK_URUN_AKTIF.CheckState) + ")");


Ben DevExpress kullandığımdan dolayı nesneler size farklı gelebilir. Diğer Devexpress nesnelerini de zamanla anlatacağım.

Saygılarımla
Mustafa BÜKÜLMEZ
http://mustafabukulmez.com/





0 Yorum: