C# Class Hazırlama Yöntemi – C# Kodları Class’a Çekme ve C# Formu Class ‘a Çekme dersim ile C# eğitim setime devam ediyorum. Bu dersimizde bir kod bloğunu nasıl class haline getirebileceğiniz anlatmaya çalışacağım. C# Eğitim Setime aşina olan herkes bilir ki ben class kullanımına çok önem veren biriyim. Bana göre bir kod bloğunu projede iki kere kullanıyorsam bu sorun vardır. Aynı kodları bir projede iki kere kullanmak mantıklı gelmiyor bana. Birden fazla kullanmam gerekiyor ise kodları bir class haline getirir öyle kullanırım. Böylece kodlarda bir değişiklik yapmam gerektiğinde projede ilgili kodları aramama gerek yok. Class dosyamdaki class’a giderim ve oradan değiştiririm. Böylece tüm projede aktif olur.
Bu dersimizde c# class nedir sorusuna, c# class oluşturma ve c# class kullanımı konusuna birden çok c# class örnekleri ile birlikte bakacağız.
Gelin C# Class Hazırlama Yöntemi – C# Kodları Class’a Çekme konusuna birlikte bakalım.
C# Class Hazırlama Yöntemi – C# Kodları Class’a Çekme
C# Class Nedir
C# Class Hazırlama dediğimizde kendimize özel bir sınıf oluşturmaktan bahsediyoruz. Sınıf dediğimiz şey ise örneğin rastgele sayılar üretebileceğimiz Random ‘u örnek verebiliriz. Yeni bir Random sınıfı tanımlarız ve bu Random içerisindeki önceden hazırlanmış metodları kullanırız. Bizim burada yapacağımız şeyde tam olarak bu. Kendi sınıfımızı üretip projemizde istediğimiz her yerde kullanabiliriz.
Ben projelerimde Cls adında bir klasör eklerim ve hazırladığım Class dosyalarını bu klasör içerisinde tutarım. Bahsini verdiğim bu class dosyalarını hemen her türlü ortak işlemler için kullanabiliriz.
Örnek vermem gerekirse, benim neredeyse her projemde kullandığım bir class dosyam var. Adı da SadeceAciklamaGirisi.cs ‘dir. Bu class dosyasındaki kodların yaptığı şey şudur.
- Kod ile bir form üretir
- Forma iki panel, bir label, bir MemoEdit (DevExpres) (Yada MultiLine TextBox) ve Button ekler.
- Panel1’in dock özelliğini Fill, Panel2’nin dock özelliğini Bottom olarak ayarlar.
- Panel1’e Label ve TextBox’u ekler.
- Label’in dock özelliğini Top, MemoEdit’in dock özelliğini de Fill olarak ayarlar.
- Panel2’ye Button nesnesini Dock özelliğini Fill olarak ekler.
- Panelleri Form’a ekler.
- Form açıldığında, MemoEdit’e açıklama yazılır.
- Button’a tıklandığında Form kapanır ve MemoEdit’e yazılan metin, Açıklama formunun açıldığı forma geri gönderilir.
Bu class’ı sadece açıklama girişi yapılabilecek bir form hazırlamak istemediğim için yapma isteği duydum. İlk amacım nasıl olacak diye bir deneme yapmaktı. Denemesini yaptım ve gerçekten çok kullanışlı olduğunu fark ettim. Hatta daha önce buna benzer bir ders daha yazmıştım. C# Dinamik Form ve Nesneler Üretip Kullanmak Bu derste vereceğim ilk örnek de bu şekilde olacak. Bir formu class’a çekme işlemine bakacağız.
C# Class Örnekleri 1 – C# Formu Class ‘a Çekme
Kodları önce adım adım vereceğim sonra hepsini bir vereceğim.
NOT 1: Burada DevExpress nesneleri kullanılmıştır. Ancak Windows nesneleri ile de çalışır.
NOT 2: Nesneleri daha da özelleştirmek istiyorsanız ilk olarak fizikse bir form açarak tasarımlarınızı yapın. Sonra Form’un Designer.cs dosyasına gidin. Orada nesnelere yaptığınız özelleştirmelerin kodlarına ulaşabilirsiniz.
Bu kodlar, class dosyasının giriş kodlarıdır. Bize lazım olan nesneleri tanımlıyoruz.
using DevExpress.Utils.DPI; using DevExpress.XtraEditors; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace Uygulama.Cls { public class SadeceAciklamaGiris { private static XtraForm fr = new XtraForm(); private static PanelControl pnl1 = new PanelControl(); private static LabelControl lbl = new LabelControl(); private static PanelControl pnl2 = new PanelControl(); private static SimpleButton btn = new SimpleButton(); public static MemoEdit txt = new MemoEdit(); public static string Aciklama = "";
Buradaki kodlarda Form nesnesini oluşturuyor ve özelleştiriyoruz.
public static string Hazirla(string FormAmac) { fr.Text = FormAmac + " Girişi"; fr.Controls.Clear(); fr.Height = 300; fr.Width = 300; fr.WindowState = System.Windows.Forms.FormWindowState.Normal; fr.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; fr.ControlBox = false;
Buradaki kodlarda, Form nesnesine ekleyeceğimiz Panel1, Label ve Textbox nesnesini hazırlıyoruz. Label ve Textbox nesnesini Panel1’e ekliyoruz
lbl.Text = FormAmac; lbl.Height = 25; lbl.BackColor = System.Drawing.Color.Turquoise; lbl.TabIndex = 0; lbl.Dock = System.Windows.Forms.DockStyle.Top; lbl.AutoSizeMode = LabelAutoSizeMode.None; lbl.Appearance.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; txt.Height = 130; txt.Dock = System.Windows.Forms.DockStyle.Bottom; txt.TabIndex = 1; txt.Properties.MaxLength = 500; txt.BringToFront(); pnl1.Dock = System.Windows.Forms.DockStyle.Fill; pnl1.Controls.Add(lbl); pnl1.Controls.Add(txt);
Buradaki kodlarda, Panel2 ve Button nesnesini üretiyoruz. Button nesnesini de Panel2’ye ekliyoruz.
btn.Dock = System.Windows.Forms.DockStyle.Fill; btn.Text = "Tamam"; btn.Name = "btn_kaydet"; btn.Click += Btn_Click; pnl2.Dock = System.Windows.Forms.DockStyle.Bottom; pnl2.Height = 100; pnl2.BringToFront(); pnl2.Controls.Add(btn);
Buradaki kodlarda, Panel1 ve Panel2 nesneleri Form nesnemize ekliyoruz. Açıklama ve Textbox’u temizliyoruz.
fr.Controls.Add(pnl1); fr.Controls.Add(pnl2); fr.ShowDialog(); txt.Text = ""; return Aciklama; }
Bu kodları çalıştırdığımızda şöyle bir ekran karşımıza çıkıyor. Yani yukarıdaki kodların çıktısı aşağıdaki gibi oluyor.
Şimdi Tamam butonun click eventini yazalım. Yukarıdaki kodlarda zaten event atamasını yapmıştık. Aşağıdaki kodlarda class dosyasının geri kalanıdır.
private static void Btn_Click(object sender, EventArgs e) { if (txt.Text.Trim().Length > 0) { Aciklama = txt.Text; fr.Close(); } else MessageBox.Show("Açıklama yazmadan devam edemezsiniz", "Uyarı", MessageBoxButtons.OK, MessageBoxIcon.Stop); } } }
Ben burada açıklama yazılmasının zorunlu olmasını istediğim için bir if kulladım. Siz burayı es geçebilirsiniz. Yani İf kontrolünü silebilirsiniz.
C# class kullanımı da aşağıdaki gibidir. Çok basit aşağıdaki gibi…
string aciklama = Cls.Forms.SadeceAciklamaGiris.Hazirla("Açıklama");
Gördüğünüz gibi tek bir satır kod ile açıklama girişi formu açıyoruz ve yazılan açıklamayı da aynı satırda elde ediyoruz. Aynı şeyi normal bir form ile yapsak söyle olurdu…
AciklamaGirisi fr = new AciklamaGirisi(); fr.ShowDialog(); string aciklama = fr.aciklama;
“Bu kadar basit bir iş içinde class hazırlamazsın” şeklinde düşünen arkadaşlar için kullanımları arasındaki farkı görebilirler. Şimdi tüm class dosyasını veriyorum
using DevExpress.Utils.DPI; using DevExpress.XtraEditors; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace Uygulama.Cls { public class SadeceAciklamaGiris { private static XtraForm fr = new XtraForm(); private static PanelControl pnl1 = new PanelControl(); private static LabelControl lbl = new LabelControl(); private static PanelControl pnl2 = new PanelControl(); private static SimpleButton btn = new SimpleButton(); public static MemoEdit txt = new MemoEdit(); public static string Aciklama = ""; public static string Hazirla(string FormAmac) { fr.Text = FormAmac + " Girişi"; fr.Controls.Clear(); fr.Height = 300; fr.Width = 300; fr.WindowState = System.Windows.Forms.FormWindowState.Normal; fr.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; fr.ControlBox = false; lbl.Text = FormAmac; lbl.Height = 25; lbl.BackColor = System.Drawing.Color.Turquoise; lbl.TabIndex = 0; lbl.Dock = System.Windows.Forms.DockStyle.Top; lbl.AutoSizeMode = LabelAutoSizeMode.None; lbl.Appearance.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; txt.Height = 130; txt.Dock = System.Windows.Forms.DockStyle.Bottom; txt.TabIndex = 1; txt.Properties.MaxLength = 500; txt.BringToFront(); pnl1.Dock = System.Windows.Forms.DockStyle.Fill; pnl1.Controls.Add(lbl); pnl1.Controls.Add(txt); btn.Dock = System.Windows.Forms.DockStyle.Fill; btn.Text = "Tamam"; btn.Name = "btn_kaydet"; btn.Click += Btn_Click; pnl2.Dock = System.Windows.Forms.DockStyle.Bottom; pnl2.Height = 100; pnl2.BringToFront(); pnl2.Controls.Add(btn); fr.Controls.Add(pnl1); fr.Controls.Add(pnl2); fr.ShowDialog(); txt.Text = ""; return Aciklama; } private static void Btn_Click(object sender, EventArgs e) { if (txt.Text.Trim().Length > 0) { Aciklama = txt.Text; fr.Close(); } else MessageBox.Show("Açıklama yazmadan devam edemezsiniz", "Uyarı", MessageBoxButtons.OK, MessageBoxIcon.Stop); } } }
Bu kısma kadar olan konu bir formu class ‘a çekme idi. Şimdi de bir kod bloğunu class’a çekmeyi görelim.
C# Class Örnekleri 2 – C# Kodları Class’a Çekme
Bir senaryo üzerinden gidelim.
Diyelim ki; Projenizde 10 farklı formda telefon numarası istiyorsunuz ve bu alanların mutlaka doldurulması gerekiyor. Bu zorunluluk var diye de kullanıcıların zorunluluğu aşmak için sama sapan bir şeyler yazmasını istemiyorsunuz. Doğru bir telefon formatına uygun bir numara yazılması gerekiyor. İnternetten araştırdınız bazı kodlar buldunuz ve forma eklediniz. Baktınız istediğiniz gibi çalışıyor kodlar.
Burada yapılacak ilk şey hemen o formlara gidip bu kodları kopyalamak olur değil mi? Aynı kodları 10 forma da yazdınız. Sonra bir sorun fark ettiniz ve ya bir şeyleri değiştirmek istediniz o zaman o 10 formu tek tek gezip kodları düzeltmeniz gerekiyor. İşte biz bunu yapmayı sevmiyoruz ve istemiyoruz. Biz bir yeri değiştirelim her yerde aktif olsun istiyoruz. Hem zamandan kazanalım hemde bir işi kolaylıkla halletmeniz hazzını yaşayalım istiyoruz.
Aşağıda bir telefon formatı kaydeden kodları görebilirsiniz.
bool Telefon_Format_Kontrol(string telefon) { Match match; string desen = ""; telefon = telefon.Replace(" ", ""); desen = @"^(05(\d{9}))$"; match = Regex.Match(telefon, desen, RegexOptions.IgnoreCase); if (match.Success) return true; else return false; }
Gayet kısa görünen bir telefon numarası formatı kontrol eden kodlar. Biz bu kodları her yerde kopyalayıp kullandık. Ama sonra bir şeyi fark ettik. Bu kontroller telefon numarasını sadece 05387776655 şeklinde olursa doğru kabul ediyor. Ama bakıyoruz ki kullanıcı çoğunlukla 5387776655 yazıyor. Bazı kullanıcılarda 905387776655 olarak yazıyor. Yani ya ilk 0 ‘ı yazmıyorlar ya da 90 ile başlıyorlar. Biz her telefon numarasının 05387776655 formatında olmasını istiyoruz. Yani kullanıcı 5387776655 da yazsa, 905387776655 da yazsa biz veritabanına 05387776655 şeklinde kaydedilmesini istiyoruz.
Kodları Düzenleyelim
Bu durumda kodlarımızı düzenlememiz gerekecek değil mi? Şimdi kodlarımızı aşağıdaki gibi düzenleyelim.
string Telefon_Format_Kontrol(string telefon) { Match match; string desen = "", DogruTelefon = ""; telefon = telefon.Replace(" ", ""); switch (telefon.Length) { case 10: desen = @"^(5(\d{9}))$"; break; case 11: desen = @"^(05(\d{9}))$"; break; case 12: desen = @"^(905(\d{9}))$"; break; default: break; } match = Regex.Match(telefon, desen, RegexOptions.IgnoreCase); if (match.Success) { switch (telefon.Length) { case 10: DogruTelefon = "0" + telefon; // 05388115145 break; case 11: DogruTelefon = telefon; // 05388115145 break; case 12: DogruTelefon = telefon.Remove(0, 1); // 05388115145 break; } } return DogruTelefon; }
Gördüğünüz gibi, ilk verdiğim kod bloğu ile neredeyse alakası kalmadı. en büyük değişiklik ilk metot bool türünde dönüş verirken ikinci metot string olarak dönüş veriyor.
Şimdi gidip bu kodları kullandığımız her yeri bulalım ve tek tek değiştirelim. Off uzun iş değil mi? Bana göre uzun ve tamamen gereksiz bir iş yükü…
Şimdi Cls adlı class dosyalarımızın yer aldığı klasöre ve yeni bir class ekleyelim ve adına Kontroller diyelim. Çünkü ileride bu tarz başka kontrolleri de bu class içerisine ekleriz. Sonuçta her kod bloğu için bir class açarsak bu sefer de class ‘lar arasında kayboluruz.
Class Dosyasını Hazırlayalım
using System; using System.Collections.Generic; using System.Linq; using System.Net.Mail; using System.Text; using System.Text.RegularExpressions; using System.Windows.Forms; namespace Uygulama.Cls { public class Kontroller { public static string Telefon_Format_Kontrol(string telefon) { Match match; string desen = "", DogruTelefon = ""; telefon = telefon.Replace(" ", ""); switch (telefon.Length) { case 10: desen = @"^(5(\d{9}))$"; break; case 11: desen = @"^(05(\d{9}))$"; break; case 12: desen = @"^(905(\d{9}))$"; break; default: break; } match = Regex.Match(telefon, desen, RegexOptions.IgnoreCase); if (match.Success) { switch (telefon.Length) { case 10: DogruTelefon = "0" + telefon; // 05388115145 break; case 11: DogruTelefon = telefon; // 05388115145 break; case 12: DogruTelefon = telefon.Remove(0, 1); // 05388115145 break; } } return DogruTelefon; } } }
Kodlarımızı Class dosyasına aldık. Şimdi bu kodları nasıl kullandığımıza bakalım.
string Telefon_cep = Cls.Kontroller.Telefon_Format_Kontrol(txt_cep_tel.Text);
Gördüğünüz gibi tek bir satırda kullanımını yapıyoruz.
Eğer burada bir değişiklik yaptıysanız. Diyelim ki metoda yeni bir parametre eklediniz. Bu durumda nerede kullandığınızı aramanıza gerek yok. F6 Build tuşuna basın ve proje bir kere build edilsin. Zaten kullandığınız noktalarda Parametre Eksik hataları çıkacağından bir dakika bir sürmeden hataları da düzenlemiş olacaksınız.
İşte Class dosyaları ile çalışmanın verdiği kolaylıklar bunlardır arkadaşlar. Bu yüzden her zaman class kullanın diyorum.
Yazıyı bitirmeden önce bir çooook bilindik bir senaryo daha vereceğim. Ama bunu kodlar olmadan anlatacağım.
C# Class Hazırlama SQL İşlemleri Hakkında
Yeni başlayan arkadaşlarımızın hatta bazı orta seviyeye gelmiş olan arkadaşlarımız formlar içerisinde hala SQL Connection String yazıyorlar. Bunu örnekleri bir çok kez gördüm.
Düşünün projenizi geliştirirken bir form içerisinde yeri geliyor 3, 4 kere SQL Connection String yazıyorsunuz. Verileri gösterme, veri ekleme, veri güncelleme ve veri silme işlemleri için… Her SQL de işlem yapmak istediğinizde bir connection yani bağlantı yapmanız gerekir. Bu sebeple de her seferinde SQL Connection String yazarsınız.
conn.Open(), conn.Close(), DataAdapter’lar, DataReader’lar vs. vs. her seferinde tekrarlayan bir dünya kod yazıyorsunuz.
Düşünün, yeni bir sql server kurdunuz, daha yüksek sürüm ve yeni bir isimle. Projenin çalışması için, projede sql server adının geçiyor olduğu her SQL Connection String’i düzeltmek zorundasınız değil mi? Ne kadar sürenizi alacak o kadar yeri değiştirmek?
Halbuki o kodları bir class içerisine alsaydınız. Sadece class dosyasının içindeki SQL Connection String cümlesini değiştirdiğinizde tüm proje de aktif olacaktı. Aradaki farkı düşünebiliyor musunuz? Belki 5, 6 hatta 10, 12 dakika sürecek eziyet yerine bir kaç saniye de halledecektiniz.
Class’lar hakkındaki Diğer yazılarımı da aşağıya bırakıyorum. Büyük ihtimalle uzun bir sür Class’lar hakkında yazı gelmeyecek.
- C# Class Mantığı ve Classlar ile Çalışma
- C# Nesne Yaklaşımlı SQL Modelleme
- C# CheckState İçin Özel Metod Oluşturmak
- Visual Studio OverLoad Metod Ayarlama ve Kullanma
- C# Extension Methods – Genişletme Metodları #1
- C# Extension Methods – Genişletme Metodları #2
- C# Extension Methods – Genişletme Metodları #3
- C# Mail Gönderme İşlemleri
- C# XML İşlemleri Class Hazırlama
- C# Dinamik Form ve Nesneler Üretip Kullanmak
C# Class Hazırlama Yöntemi – C# Kodları Class’a Çekme ve C# Formu Class ‘a Çekme dersim buraya kadardı. Diğer derslerimizde görüşmek üzere…
Uzun bir ders oldu. Bu dersimizde c# class nedir sorusunun cevabını verdim. C# class oluşturma ve c# class kullanımı konusunu da birden çok c# class örnekleri ile birlikte anlatmaya çalıştım.
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.