ASP.Net | Masterpage

Posted by mezo | Posted in ASP.Net, C#, Yazılım | Software | Posted on 21-02-2012-05-2008

0

Asp.Net de kullanılan ve çok önemli bir konu olan Masterpage konusunun netten indirilen bir hazır CSS template üzerinde uygulanışı ile alakalı ayrıntılı bir video iyi seyirler dilerim ;)

Formlar Arası Veri Transferi

Posted by mezo | Posted in C#, Introduction | Posted on 12-02-2012-05-2008

1

C# da form uygulamalarında formlar arasında veri aktarımı nedir nasıl yapılır ? ;)

Formlar Arasi Veri Transferi from M.Zeki Osmancık on Vimeo.

Sınırsız Ağaç Yapısı ve Treeview Kullanımı

Posted by mezo | Posted in ADO.Net | Posted on 24-01-2012-05-2008

0

Merhaba arkadaşlar

Bu yazımda çokça bahsedilen çokça kullanılacak olan bir kontrol yapısı ve bunun database den gelen verilerle nasıl çalıştığını göstermek isterim sizlere…

Bahsettiğimiz kontrolümüz Treeview denilen bir nesne bu nesne bizlere ağaç yapısı bulunan bilgileri rahatlıkla ve tek ekranda görmemizde bizlere kolaylık sağlayan bir kontrol peki ama nasıl bu kontrole birşeyler ekler kullanılabilir hale getirebiliriz…

Öncelikle bir DB ye ve tabloya ihtiyacım var sırası gelmişken birde SQL tablosunda sınırsız ağaç yapısından bahsetmeden olmaz heralde.  Şekildeki gibi bir veritabanı oluşturdum…

 

Buradaki mantık aslında basit eğer bir kayıt root kayıtsa yani kök kayıtsa o zaman AltKategoriID si NULL olmalıdır. Eğer girdiğimiz kategori başka bir kategori altında duruyorsa o halde hangi kategori üst ise AltKategoriID sine o kaydın ID değerini girmeliyiz. Zaten resimdeki birbirine bağlı yapıda bunu temsil eder. Birde girdiğimiz verileri inceleyin bakalım nasıl birşey varmış :D

Burada Elektronik root yani ana kategori Bilgisayar onun altında bulunduğu için Bilgisayar kaydının AltKategoriID si Elektronik kaydının ID sine eşit Bilgisayarın altında olanlarda Bilgisayar kaydının ID sine sahip olacaktır böylelikle alt alta uzayıp giden sınırsız bir ağaç yapısına sahip olabiliriz.

Peki tablomuz tamam verilerimizide girdik e hani Treeview  derseniz onuda şöyle özetleyelim

Yeni bir Windows formuma Treeview ve button nesnemi yerleştirdim

Ardından button nesnesinin Click olayına gelerek dedim ki  :

DataRelation baglanti;private void btnListele_Click(object sender, EventArgs e){SqlConnection cnn = new SqlConnection(“Data Source = .; Initial Catalog = Deneme; User = sa; Password = 1234567?;”);SqlDataAdapter adp = new SqlDataAdapter(“Select * From Kategoriler”,cnn);

DataSet ds = new DataSet();

adp.Fill(ds,”Kategoriler”);

 

baglanti = new DataRelation(“baglan”,ds.Tables["Kategoriler"].Columns["KategoriID"],

ds.Tables["Kategoriler"].Columns["AltKategoriID"]);

 

ds.Relations.Add(baglanti);

 

foreach (DataRow dr in ds.Tables["Kategoriler"].Rows)

{

if (dr["AltKategoriID"] == DBNull.Value)

{

TreeNode root = new TreeNode(dr["KategoriAdi"].ToString());

root.Tag = dr["KategoriID"];

tvAgac.Nodes.Add(root);

AltKategorileriGetir(dr,root);

}

}

tvAgac.ExpandAll();

}

 


Kodlara bakacak olursak klasik bir ADO.net ile verilerimi alıp bir DATASET e eklemişim biliyorsunuzki DATASET nesnesi içine birden

fazla DATATABLE nesnesi barındırabilen bir nesne yani sanal veritabanı gibide düşünebiliriz aslında. Peki database de bağlantılar olurda bunda olmazmı ? Olmamı tabikide olur bu bağlantıyıda DATARELATION nesnesi sağlar işte tam burada bende verilerimi çektikten sonra içindeki hangi veri ile hangi verinin eşleşeceği yani hangisinin ana ID hangisinin ona bağlı olan Altkategori olduğunu belirtip bağlantımı tamamladım. Ardından bir foreach ile Dataset içersine attığım Datatable içindeki satırları tek tek almaya başladım ve bu foreach içersinde sadece AltKategorisi NULL olanları aldım yani Root olan kök olan kayıtları aldım ve Treeview nesneme ekledim.

Peki bunun altında bişi yokmu ? Altındakini hatta onun altındaki kayıtları nasıl alacağız derseniz ondada bir metotun yardımını isteyip o metodu kendi içersinde çağırarak işimizi çözeceğiz…

 

private void AltKategorileriGetir(DataRow dr,TreeNode pNode){foreach(DataRow row in dr.GetChildRows(baglanti)){TreeNode childNode = new TreeNode(row["KategoriAdi"].ToString());childNode.Tag = row["KategoriID"];

pNode.Nodes.Add(childNode);

AltKategorileriGetir(row,childNode);

}

}

 

Bu metodu çalıştırırkende biraz once kontrol ettiğimiz root kaydı ve oluşturulan TreeNode nesnesini parametre olarak yolladıktan sonra oluşturduğumuz bağlantı nesnesi ile Altkategorideki değerleri kontrol ediyoruz ve varsa yine TreeNode oluşturup mevcut Node altına ekliyoruz. Vee sonra kategori ve altındaki elemanları tek tek karşıma geliyor

Umarım yararlı olur

Görüşmek Üzere

M.Zeki Osmancık

 

GDI 2 – Grafik Çizimi

Posted by mezo | Posted in C#, Introduction | Posted on 10-10-2011-05-2008

2

Merhaba arkadaşlar

GDI ile ilgili önceki yazımızda neyin nasıl kullanılacağını görmüştük bu sefer bu GDI metotlarını kullanarak nasıl hesaplamalar yaparız. Seçim sonuçlarında hep görürüz bir pasta dilimi üzerinde partilerin oyları görünür ve yüzde olarak pasta grafikde bir dilim kaplarlar . Bakalım bizim partilerden hangisi ne kadar oyla pastanın neresinde duracak ???

Öncelikle WindowsForm uygulamamız üzerine 2 TextBox 1 Button ve 1 PictureBox atıyoruz.

Bu görüntüyü elde ettikten sonra yapmamız gerek pek de birşey kalmadı aslında sadece kod bloğunu açıp yazmak kalıyor :D

string[] partiler = new string[10];int[] oylar = new int[10];int siraNo, toplamOy;

 

Öncelikle yukardaki gibi değerlerimi tutacağım dizilerimi  ve hesaplama yapabilmek içinse değişkenlerimi GLOBAL olarak tanımladım.

Daha sonra buton içersinde değerlerimi alıp bunları grafiksel olarak picturebox içersine çizdireceğim.

Öncelikle 10 elemanlı bir dizi oluşturduğum için dizinin boyutundan çok eleman girilmesin diye bir kontrol yapıyorum. Ardından oylar içersine değer eklerken int değerlerin girildiğinden emin oluyorum…

            if (siraNo == 10){MessageBox.Show(“10 partiden fazla olamaz???”);return;

}

try

{

oylar[siraNo] = int.Parse(textBox2.Text);

}

catch (Exception)

{

MessageBox.Show(“Oylarda Hata Var”);

return;

}

 

Hem partiler hemde oylar aynı indeks numaralarına yazdırılacak .

            partiler[siraNo] = textBox1.Text;toplamOy += oylar[siraNo];siraNo++; 

Graphics grp = this.pictureBox1.CreateGraphics();

grp.Clear(pictureBox1.BackColor);

Random rnd = new Random();

int i, basAci=0,yayAci ,boy=0;

Color renk;

HatchBrush firca;

Toplam oy sayısını hesaplıyoruz.  Ardından nesnelerimizi tanımlıyoruz.  Picturebox üzerine çizim yapabilmek için Graphics nesnesi oluşturuyoruz. Picturebox da ne varsa siliyoruz. Color değişkeni ve desenli çizim için HatchBrush nesnesi oluşturuyoruz.

Index numarasına göre tüm dizi içersindeki elemanları alıp grafiksel olarak çizebilmek için bir for döngüsü oluşturuyoruz.

            for (i = 0; i <= siraNo-1; i++){yayAci = 360 * oylar[i] / toplamOy;renk = Color.FromArgb(rnd.Next(255), rnd.Next(255), rnd.Next(255));

firca = new HatchBrush((HatchStyle)rnd.Next(50), renk);

grp.FillPie(firca,0,80,200,200,basAci,yayAci);

 

grp.DrawString(“% ” + boy.ToString(), new Font(“Tahoma”, 8, FontStyle.Bold), Brushes.Black, 5, 80 + i * 20);

grp.FillRectangle(firca, 260, 80 + i * 20, 18, 18);

 

grp.DrawString(partiler[i] + ” = ” + oylar[i].ToString(), new Font(“Tahoma”, 8, FontStyle.Bold), Brushes.Black, 290, 80 + i * 20);

basAci += yayAci;

}

 

Çizdireceğimiz FillPie nesnesinin kaç derecelik bir açı ile çizileceğini hesaplamak için yay _aci değişkenini kullanacağız.  Random renk elde edebilmek için Color.FromArgb metodunu kullanarak rastgele renk değerlerini veriyoruz. HatchBrush üzerindede random olarak desen gelebilmesi için gerekli tanımlamayı yapıyoruz. Ardından küçük bir kare rengin hangi partiye ait olduğunu göstermek için hemen yanınada partinin adı ve oy sayısı  yazdırdıktan sonra en son tanımladığım başlangıç açısı bas_Aci değişkenini çizdiğim şeklin yay_Aci değeri kadar arttırıp yeni çizilecek olan pie için başlangıç konumunu belirliyoruz.

Ve son olarak karşımıza çıkan görüntü :

Böylelikle Graphics nesnesindeki değerlerin nasıl işimize yarayacağı biraz daha kafamızda oturmuş olur umarım…

Görüşmek Üzere.

M.Zeki OSMANCIK

XML ile Telefon Defteri Yapalım 2!!

Posted by mezo | Posted in ASP.Net | Posted on 19-01-2011-05-2008

4


Bir önceki yazının devamı olarak bu yazımızdada projemizi geliştirmeye devam ediyoruz.

Listbox a kayıtlarımızı ekledikten sonra listbox üzerinde bir kaydı seçtiğimizde bilgilerin ilgili textbox lara yazılmasını istiyoruz bunun içinde Listbox kontrolünün SelectedIndexChanged olayına ilgili kodları yazıyoruz.

protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e)

{

xmlDoc = new XmlDocument();

xmlDoc.Load(dosya);

XmlNode secilen = xmlDoc.SelectSingleNode(“Kisiler/Kisi[Ad='" + ListBox1.Text + "']“);

TextBox1.Text = secilen["Ad"].InnerText;

TextBox2.Text = secilen["Soyad"].InnerText;

TextBox3.Text = secilen["Telefon"].InnerText;

}

Bu işlemden sonra projemizde bir adım daha atmış oluyoruz ve her kaydı seçtiğimizde o kayıtla ilgili tüm bilgiler ilgili textboxlara yazılıyor. Bu bize Update işleminde çok büyük kolaylık sağlayacak.

İlk olarak Kaydet butonunu işlevine kavuşturalım. Ve buton1 in Click olayına ilgili kodları yazalım.

protected void Button1_Click(object sender, EventArgs e)

{

xmlDoc = new XmlDocument();

xmlDoc.Load(dosya);

XmlElement xe = xmlDoc.CreateElement(“Kisi”);

XmlNode ad = xmlDoc.CreateNode(XmlNodeType.Element,”Ad”,”");

XmlNode sAd = xmlDoc.CreateNode(XmlNodeType.Element, “Soyad”, “”);

XmlNode tel = xmlDoc.CreateNode(XmlNodeType.Element, “Telefon”, “”);

XmlAttribute xa = xmlDoc.CreateAttribute(“Tur”);

xa.Value = “Cep”;

tel.Attributes.Append(xa);

ad.InnerText = TextBox1.Text;

sAd.InnerText = TextBox2.Text;

tel.InnerText = TextBox3.Text;

xe.AppendChild(ad);

xe.AppendChild(sAd);

xe.AppendChild(tel);

xmlDoc.DocumentElement.AppendChild(xe);

xmlDoc.Save(dosya);

TextBox1.Text = “”;

TextBox2.Text = “”;

TextBox3.Text = “”;

TelefonlariYukle();

}

XmlElement: Xml dosyası içersinde bulunan bir elemanı temsil eder.

XmlNode: Eleman içersindeki her bir düğümü temsil eder.

XmlAttribute : Düğümlerin sahip olduğu özellikleri temsil eder.

Görüldüğü üzere Xml dosyamızı bir database gibi kullanarak kayıtları görüntüleyip yeni kayıtları Xml üzerine yazabiliyoruz.

Bilgiyle Kalın…

M.Zeki Osmancık

C# | Methods

Posted by mezo | Posted in Introduction | Posted on 16-10-2010-05-2008

4



Merhaba arkadaşlar programları yazarken çoğu kez bir işlemi birden fazla yerde yapmamız gerekebilir.  Bu da her seferinde aynı kodu yazmak anlamına geliyor ve buda bize hem zaman kaybı  hemde kod karışıklığına neden olacaktır. Peki buna çözüm olarak yapacağımız işlemle alakalı koda bir isim versek ve kullanmak istediğimiz yerde o kadar kodu tekrar tekrar yazmayıp sadece ismiyle çağırsak nasıl olur ? Bence süper olur :D

Metotlar işte bu işlemi yaparlar bir isimle çağırılarak içersindeki işlemleri tek satırda çağırabilmemizi sağlar. Metotları bir işci olarak düşünebiliriz biz ona ne iş yapması gerektiğini söyleriz ve ismini söylediğimizde o iş yapılır.

Örnek olarak bir öğrenci takip programı yaptığımızı düşünelim. Bu program için ilk önce düşünülmesi gereken form Öğrenci Kayıt formudur ve bu form basit olarak aşağıdaki gibi bi görüntüye sahip olacaktır.

En basit işlemi düşünecek olursak doldurulmuş olan textBox ların temizlenmesini istiyorum ve bunun için form içersine bir Temizle butonu yerleştiriyorum ve bu butonda bütün butonları temizliyorum.

private void btnTemizle_Click(object sender, EventArgs e)

{

txtAd.Clear();

txtSoyad.Clear();

txtTcNo.Clear();

txtDogumYeri.Clear();

txtVeliAd.Clear();

txtVeliSoyad.Clear();

txtTelefon.Clear();

}

Çalıştırdığımda kodlarımın çalıştığını görüyorum tüm alanlar temizleniyor ;) .  Buraya kadar bir sorunumuz yok. Peki Kaydet butonuma bastığımda kaydetme işlemleri tamamlandıktan sonra kullanıcının yeni kayıt ekleyebileceğinide hesaba katıp kaydetme işleminden sonrada textBoxları temizlememiz gerekiyor. Aynı kodları tekrar yazarsak sorun kalmaz ama sadece bu kadarla kalmasak ve bu formda 2 den fazla yerde textBoxları temizlemek istesek her seferinde bu kodları tekrar tekrarmı yazıcaz ? Diyelimki yazdık program çalışıyor. Daha sonra okul yönetimi bizden 2 textbox daha koymamızı istedi. Biz yazdığımız Clear kodlarına 2 satır daha eklememiz gerekicek ama bir çok yerde kullandığımız için bir tanesini bile unutsak sıkıntı çıkacaktır. Bu kodları merkezi bir yerde toplasak ve ihtiyacımız olduğunda sadece ismi ile çağırsak nasıl olur ? ;)

Metotda değişiklik yaptığımızda tüm farklı yerlerde kullandığımız kodlarda değişecektir. Gelin nasıl yapıyoruz bu işlemi görelim . Bir Metot tanımlayarak aynı işlemi birden fazla yerde yapalım ;)

Void MetotAdi()

{

Yapılacak işlem

}

private void btnTemizle_Click(object sender, EventArgs e)

{

Temizle();

}

private void btnKaydet_Click(object sender, EventArgs e)

{

Temizle();

}

private void Temizle()

{

txtAd.Clear();

txtSoyad.Clear();

txtTcNo.Clear();

txtDogumYeri.Clear();

txtVeliAd.Clear();

txtVeliSoyad.Clear();

txtTelefon.Clear();

}

Görüldüğü gibi tek bir metodu yani işçimi sadece adını çağırarak işimi yaptırabiliyorum. ;)

Void metotlar örnekteki gibi sadece içersinde tanımlanan işi yapar. Geriye bir değer döndürmezler.

Metot içersinde yapılan işlem sonucu geriye bir değer döndürmek istiyorsak geriye dönen değer tipinde bir metot oluşturmamız gerekir. Yani işçimize işini yap ama bana yaptığına dair bilgi getir diyoruz. J

Örnek olarak iki sayıyı toplayarak sonucu geri deger olarak döndüren bir metot yazalım.

private void btnTopla_Click(object sender, EventArgs e)

{

MessageBox.Show(Topla().ToString());

}

int Topla()

{

int sayi1 = 5;

int sayi2 = 6;

int sonuc = sayi1 + sayi2;

return sonuc;

}

Gördüğümüz gibi içeride yapılan işlemin sonucu metodun tipinde olmak zorunda.

Birde içeriye değer gönderebildiğimiz metot tipleri varki buda metot – işçi metaforunu tamamlayan unsurlardan biz işçimizin eline malzemeleri veriyoruz ona sadece o malzemelerle ona söylenmiş olan işi yapmak kalıyor. Ve yine bize bu malzemelerle yaptığı işin sonucunu dönmek zorunda.

private void btnTopla_Click(object sender, EventArgs e)

{

MessageBox.Show(Topla(5,6).ToString());

}

int Topla(int sayi1 , int sayi2)

{

int sonuc = sayi1 + sayi2;

return sonuc;

}

Ne kadar kolay değilmi ? ;)

Bir sonraki yazımızda görüşmek üzere.


C# | Diziler | Foreach Döngüsü

Posted by mezo | Posted in Introduction | Posted on 14-10-2010-05-2008

0



Merhaba arkadaşlar bu yazımızda da dizileri anlamaya çalışacağız.  Bu yazı sonunda dzi nedir , nasıl tanımlanır dizilerdeki boyut dizilerin metotları ve foreach döngüsü ile alakalı bilgi sahibi olacaksınız.

Daha önce değişkenler ile ilgili bir yazımız vardı. Hatırlarsak değişkenler program içersinde bize geçiçi süre gerekli olan değerleri tutabildiğimiz yapılardı örneğin int sayi = 5; diyerek 5 sayısını sayi değişkeninde tutabiliyordum. Peki bu sayi değişkeninde birden fazla değer tutmam gerekirse bunu gerçekleştirebilirmiyim ? Cevap değişkenlerle hayır ama Dizilerle evet.

Sizinde anlayacağınız gibi dizi değişkenleri, aynı tipte birçok veriyi bir arada tutmayı sağlar. Benzer işlemlerde kullanılan değişkenler bir dizi altında listelenebilir. Yani ben sayi değişkenimi dizi olarak tanımlarsam o zaman birden fazla değeri içersinde tutabilirim.

Dizilerin tanımını yaptıktan sonra gelin bu dizi nasıl birşeymiş nasıl yazılırmış ona bir göz atalım.  Dizi tanımları veritiplerinin yanında [] simgeleri ile yapılır.

<veri tipi> [] dizi ismi = new <veri tipi> [dizi eleman sayısı]
String[] isimler;

İnt[] sayilar;

Float[] paralar;

Byte[] yaslar;

Dizilerin kaç eleman içereceği, dizi tanımlanırken ya da daha sonra belirtilebilir. Şu şekilde tanımlanabilirler:

int[] sayilar = {3, 8, 2, 6};

int[] sayilar = new int[6]{4, 2, 5, 6, 7, 0};

int[] sayilar = new int[5];

Dizilerin indis numaraları 0 dan başlar ve devam eder. Orneğin isimleri tutacağımız bir dizi tanımladık:

string[] isimler = new string[4];

değerlerini atarken yapacağımız işlem şu olacaktır.

İsimler[0]=”Zeki”;

İsimler[1]=” Yudum”;

İsimler[2]=”Ali”;

İsimler[3]=” Orhan”;

Küçük bir dizi uygulaması yapalım. Bir dizi ve elemanlarını tanımlayarak ListBox içersinde bu değeri gösterelim.

İşte bu kadar kolay bir değişken tanımlar gibi fakat içersinde birden fazla değer taşıyabilen bir değişken gibi düşünebiliriz.

Peki birden fazla boyuta sahip diziler tanımlamak mümkünmü ?  Yani tanımladığımız dizinin 1 elemanıda birkaç değere sahip olsa …

Diziler tek boyutlu olduğu gibi, birkaç boyutlu diziler de tanımlanabilir.  Örneğin :

int [,] matris = new int[5,6];

Bu diziyi tanımladığımızda önce 5 elemanlı bir dizi ardından bu dizinin her elemanı içinde 6 elemanlık bir dizi tanımlamış oluruz.  Yani 2 boyut oluşturmuş oluruz.

Bu dizide bir boyut daha olsaydı, o boyutun her elemanı için diğer boyutlardaki 30 eleman bulunacaktı. Çok boyutlu dizilerin eleman sayıları boyutlarındaki eleman sayılarını çarparak hesaplanabilir.

int [,,,,] dizi = new int[boyut1,boyut2,boyut3,... ,boyutn];

Dizilerin boyutlarınada göz attıktan sonra gelin isterseniz bir kaç metodunada bakalım.

Dizilerin Metotları

Array.Resize();

Resize metodu mevcut dizimizin eleman sayısını istediğimiz kadar arttırır. Bir örnekle bakalım bu olaya bir form üzerinde listbox textbox ve butonumuz olsun ve textbox a yazdığımız değer string bir diziye ve listbox a eklensin istiyorum. İlk etapta ne kadar değer girileceğini bilemiyeceğimizden önce 1 elemanlı bir dizi tanımlıyorum ve her eleman eklendiğinde dizi boyutunu arttırıyorum.

Array.Clear();

Dizimiz içersindeki değerleri temizlemek isteyebiliriz işte bu gibi durumlarda Array.Clear kullanıyoruz. Biraz önce yaptığımız proje üzerinde ufak değişikliklerle Clear metodunu inceleyelim.

Foreach Döngüsü

Daha önceki yazımızda bahsettiğimiz döngüler arasında bir tane daha vardı ama ona bu konunun sonunda değinmek daha mantıklı sanki.

Foreach döngümüz bir dizi veya kolaksiyonun her elemanı için yapısındaki kodları çalıştıran bir döngüdür.

foreach (<tip değişkeni > in <koleksiyon> )

{

Yapılacak işlemler

}

Bilgiyle Kalın…
M.Zeki Osmancık

C# | OOP Terminolojisi

Posted by mezo | Posted in OOP | Posted on 14-10-2010-05-2008

0



Access Modifier : Bir tipe veya tipin üyelerine erişimi sınırlayan private, protected, internal, public gibi kelimelerdir.

Accessible Member : Verilen tip tarafından ulaşılabilen üyedir. Bir tip ile erişilebilen bir üye başka bir üye tarafından erişilebilir olmayabilir.

Accessor : Bir özellik (Property) ile ilişkilendirilmiş Özel (private) veri alanı (data field) üyenin değerini alan veya ayarlayan metodlardır. Okunur-Yazılır özellikler get ve set erişimcilerine sahipken salt okunur özellikler sadece get erişimcisine sahiptirler.

Anonymous Method : Bir delegeye parametre olarak geçilirilen bir kod bloğudur.

Base Class : Türetilmiş sınıf (Derived Class) tarafından miras alınan sınıftır (Inherited Class).

Call Stack : Çalıştırma zamanında (runtime) programın başından başlayarak çalıştırılacak ifadeye kadar olan yapılan metod çağrılarının dizisidir.

Class : Nesneyi tanımlayan, nesneye şablon oluşturan veri tipidir. Sınıflar veri ve veriyi etkileyen metodlardan her ikisini de içerebilirler.

Constructor: Bir sınıf veya yapı üzerinde bulunan ve o tipteki nesneleri oluşturan özel metodlardır.

Delegate : Bir metodu referans eden bir tiptir. Bir delege metoda atandığında tam olarak o metod gibi davranır.

Derived Class : Başka bir taban sınıfın davranışına ve verisine erişmek, geliştirmek veya değiştirmek için miras yöntemini kullanan sınıftır.

Destructor : Örneğin sistem tarafından sonlandırılmasını hazırlayan, sınıf veya yapı üzerindeki özel bir metodtur.

Event : Bir değişikliğin bilgilendirmelerini gönderen sınıf veya yapı üyesidir.

Field: Sınıfın ya da yapının doğrudan erişilen veri üyesidir.

Generics : Jenerikler, bir sınıf ya da metodun bir tip parametresi ile tanımlanabilmesine olanak sağlarlar. İstemci kodu tipin örneğini yaratırken parametre olarak tanımlanan tipi belirli bir tipte değişken olarak tanımlar. Böyle parametrenin hangi tipte olduğu tanımlandığından sınıf ya da metodta o tip olarak kullanılabilir.

IDE (Integrated Development Environment) : Derleyici, debug edici, kod düzenleyici ve tasarım araçları gibi çeşitli geliştirme araçları için birleştirilmiş bir arayüz sağlayan uygulamalardır.

Immutable Type : Örnek yaratıldıktan sonra, örneğinin veri, alan ve özellikleri değişmeyen tiplerdir. Değer tiplerinin çoğu böyle tiplerdir.

Inaccessible Member : Belirtilen bir tip tarafından erişilemeyen bir üyedir. Bir tipe Erişilmez bir üyenin başka bir tipe de erişilmez olması gerektiğine dair bir zorunluluk yoktur.

Inheritance : C#, Miras almayı destekler. Yani bir sınıf (class) taban sınıf (base class) olarak adlandırılan sınıftan türetilir ve aynı metod ve özellikleri miras alır. Bunu sınıfa Türetilmiş Sınıf (Derived Class) denir.

Interface : Sadece public metod, olay ve delegelere ait imzaları içeren bir tiptir. Arayüzü miras alan bir nesne arayüzde imzaları tanımlanan tüm metod, olayları geliştirmek zorundadır. Sınıflar veya Yapılar (Structs) herhangi bir sayıda arayüzden miras alabilirler…

Iterator : Öteleyici, bir sınıfın içerdiği bir koleksiyon veya diziyi (array) sınıf kullanıcılarının foreach ile kullanabilmesine olanak sağlar.

Member : Bir sınıf (class) ya da yapı (struct) üzerinde tanımlana alan (field), özellik (property), metod (method) veya olaylara (events) o sınıfın üyeleri (class members) denir.

Method: Bir sınıf (class) ya da yapı (struct) için davranışı sağlayan isimlendirilmiş kod bloğudur.

Mutable Type : Örnek yaratıldıktan sonra, örneğinin veri, alan ve özellikleri değiştirilebilen tiplerdir. Referans tiplerinin çoğu böyle tiplerdir.

Nested Type : Diğer bir tipi tanımının içinde tanımlanmış tiptir.

Object : Sınıf örneğidir (instance). Bir nesne bellekte bulunur ve verisi ve bu veriler üzerinde etkisi olan metodları vardır.

Property : Özellikler, erişimcileri aracılığı ile bir veri üyesine ulaştırırlar.

Refactoring :
Bilgisayar terminolojisinde bilgisayar yazılımının çıktılarını ve işlevlerini değiştirmeden iç yapısının yeniden düzenlenerek uygulamanın geliştirilmesi, iyileştirilmesi demektir. Kısaca önceden girilmiş kodun tekrar kullanılması diyebiliriz. Visual Studio C# düzenleyicisi akıllıca kodunuzu tekrar biçimlendirebilir. Mesela işaretlediğiniz bir kod bloğunu bir hamleyle bir metoda dönüştürebilirsiniz.

Reference Type : Bir veri tipidir. Referans tipi olarak tanımlanan bir değişken verinin depolandığı konumu işaret eder.

Static : Statik olarak tanımlanan bir sınıf ya da metod “new” anahtar kelimesi ile ilklendirilmeden varolabilir.
Örneğin Main() statik bir metoddur.

Struct : Tipik olarak bazı mantıksal ilişkileri olan değişkenler içermesi için kullanılan birleşik veri tipidir. Yapılar aynı zamanda metodlar ve olaylar içerebilirler. Miras almayı desteklemezken arayüz kullanımını desteklerler. Sınıflar referans tipiyken, yapılar değer tipidir.

Value Type : Öbek (Heap) üzerine yerleştirilen referans tiplerine karşın yığın (stack) üzerine yerleştirilen veri tipidir. Yapı ve null değer alabilen (Nullable) tiplerin de olduğu gibi Nümerik tipleri de içeren Yerleşik (built-in) tiplerin hepsi değer tipleridir. Sınıf tipi ve string tipi referans tipleridir.

kaynak: http://msdn2.microsoft.com/en-us/library/ms173231.aspx

Bilgiyle Kalın…
M.Zeki Osmancık

http://izmiradam.net/2010/10/c-oop-terminolojisi/

C# | Döngüler | For | While

Posted by mezo | Posted in Introduction | Posted on 14-10-2010-05-2008

0



Merhaba arkadaşlar bu yazımızda C# programlama içersinde bulunan döngüleri sizlere anlatmaya çalışacağım. Bu yazının sonunda ardarda işlemleri nasıl kısa yolla yapabilirsiniz, for döngüsü ve while döngüsü ile ilgili bilgi sahibi olacaksınız. Haydi başlayalım… :D
Döngüler programlarımızda ardarda yada sıralı şekilde yaptıracağımız işlemleri için kullanılır. Fazla kod ,zaman kaybı ve performans açısından yarar sağlarlar. Diyelim ki öğrenci kaydı yapabileceğimiz bir windows form tasarlıyoruz ve bu windows formu üzerinde combobox nesnemiz yer almakta yıl kısmının yanlış yazılmasını engellemek için biz girerek kişinin sadece seçme işlevini yerine getirmek istiyoruz. İlk aklımıza gelen ComboBox nesnemizin items özelliği üzerinden tüm bilgileri girmek oldu değilmi ?

İster items özelliğinden dolduralım istersek kod ile dolduralım yinede bu işlem bize inanılmaz vakit kaybına neden olacaktır. Peki bir kolay yolu yokmu bu işi yapmanın tabi ki var. Döngüler bu konuda bizlere yardımcı oluyorlar.   Yukarıda bahsettiğimiz işlem için sadece döngü kullanmamız yetecektir.

For Döngüsü

for (başlangıç; koşul;artım)

{

Yapılacak işler;

}

Belirtilen başlangıç değerinden itibaren koşul sağlanana kadar içine yazılan kod parçasını çalıştırır ve bize sıralı işlemlerimizi hızlıca yapmamızı sağlar. Buna göre yukardaki işlemimiz nasıl oluyor görelim.

Ne kadar kolay değilmi ? :D

Peki bu for döngüsü içersinde bir erken geçiş sağlamak istersek o zaman ne yapmalıyız?

for (int i = 1950; i < 2010; i++)

{

if (i == 1965)

{

continue;

}

comboBox1.Items.Add(i.ToString());

}

Biraz önce ki doldurma işlemi sırasında bir koşul sağlanıyorsa o koşulun sağlandığı değeri atlayarak döngü devam eder. Yani burada i 1965 olduğunda o satırdaki işlemi atlayacak ve 1966 dan devam edecek

Continue ile oluşan işlemi anladıysak birde koşul sağlandığında döngü işlemine son veren bir kodumuz daha var :

Break

for (int i = 1950; i < 2010; i++)

{

if (i == 1965)

{

break;

}

comboBox1.Items.Add(i.ToString());

}

MessageBox.Show(“Döngü Sonlandırıldı.”);

Yine aynı işlem için break işlemi yapıldığı zaman koşul sağlanıyorsa döngüden çıkarak sadece 1965 e kadar olan sayıları ComboBox nesnesi üzerine ekler.

Return

Bir döngünün sonundaki erken geçişi sağlar koşul sağlanmıyorsa hiç bir işlem yapmadan çıkar.

for (int i = 1950; i < 2010; i++)

{

if (i == 1965)

{

return;

}

comboBox1.Items.Add(i.ToString());

}

MessageBox.Show(“Döngü Sonlandırıldı.”);

While Döngüsü

Bir başka döngü türü olan while bir koşul sağlanıyorken dönmeye devam eden döngü çeşididir. Koşul false ise döngü sona erer.

while(koşul)

{

Yapılacak işler;

}

Aynı örneğimizi While ile yaptığımızda bu kez biraz syntax değişiyor ama yaptığımız işlem aynı.

Koşulumuz sağlandığı sürece yani i 2010 dan küçük olduğu sürece işlemimizi sürdürdü ve yine aynı örneğimizdeki Combobox itemlerini ekledik.

While i en güzel anlatan örnek belkide Eşşek Sudan Gelinceye Kadar Dayak Yemek deyimi.

Hadi gelin bu örneği yapalım :D

Do While Döngüsü

Diğer döngülerden farkı koşul sonda kontrol edilir. Buda döngünün en az 1 kere çalışacağı anlamına gelir.

Do

{

Yapılacak işler;

} while (koşul);

Bilgiyle Kalın…
M.Zeki Osmancık

ASP.Net | Output Cache

Posted by mezo | Posted in ASP.Net | Posted on 06-10-2010-05-2008

1



Merhaba Arkadaşlar
Bu yazımda sizlere ASP.Net ile dinamik web siteleri yaparken performansı etkileyecek bir yapıdan bahsetmek istiyorum. Genellikle bu tip web sayfalarında veriler veritabanından çekilir. Bir sayfada, her seferinde veritabanına bağlanmak ve özellikle farklı tablolardan veri çekiyorsak, performansı önemli derecede etkiler .Herseferinde veritabanına gidip farklı tabloları bulup verileri web sayfası üzerine çekmek sayfayı yavaşlatır kullanıcıyı usandırır. Yavaş bir web kullanıcı üzerinde negatif bir etki yaratır. Bunun için ne yapmak gerekiyor peki ?
Sayfalarımızda bulunan verinin güncellenme sıklığına göre belirli bir süre tüm verileri Cache işlemine tabi tutsak ve kullanıcı sayfayı çağırdığında her seferinde veritabanına bağlanmaktansa cache te var olan veriyi göstersek çok daha performanslı olmazmı ? Belirtilen süre bittiğinde ise 1 sefer gidip veritabanından bilgileri alıp tekrar cache içersine doldurduğumuzda tadından yenmez . :D
Peki sayfamızı Cache dediğimiz yapı içersine almak için ne yapmak gerekiyor ?

Yapmamız gereken sadece aspx sayfamızın ilk satırlarına yukardaki yapı gibi
<%@ OutputCache Duration=”30″ VaryByParam=”none” %> kodunu eklemek olacak böylelikle sayfamız outputcache ile komple cache işlemine tabi olacak ve Duration kısmında belirttiğimiz saniye cinsinden süre kadar cache de kalacak. Sizde bir sayfa üzerine basitçe veritabanından veri çekerek bu işlemi uygulayın ve veritabanını güncelledikten sonra sayfanızıda güncelleyin verdiğiniz Duration süresi boyunca sürekli güncellemeden önceki bilgiler gelecek.Duration süresi bittikten sonra tekrar veritabanına bağlanarak tekrar bir cache yapacaktır. Bunu sizin de yapmanızı istedim çünkü etkisini mutlaka görmelisiniz.

Senaryomuz şu olsun : Diyelimki biraz önce belirttiğim sayfanız üzerine çektiğiniz bilgi ürün kategorileri olsun. Bu kategoriler hangi sıklıkla güncellenir? Ancak yeni bir ürün grubu geldiğinde değilmi ? Buna göre sayfa üzerinde  sürekli veritabanına bağlanıp güncel kategori bilgileri ile dönmesinin bir anlamı olmaz. Bu sayfayı 1  günlük cache işlemine aldığımızda ilk kullanıcı sayfayı açtığında veriler cache atılacak daha sonra tüm gün veritabanına bağlanmayacak SqlServer için ne kadar rahatlatıcı değilmi ?J

Kategorilerin olduğu sayfayı cache e attık çok güzel!  Birde bu kategorilere tıkladığımzda o kategoriye ait olan ürünleri gösteren bir  Ürünler sayfamız olsa ve QueryString ile gelen kategoriID si ne göre ürünleri gösterse ve bu ürünler sayfasınıda Cache atmak istesek aynı işlemi uygulasak ????

Belirttiğimiz süre içersinde hangi kategoriye tıklarsak tıklayalım hep aynı kategoriye ait ürünler görülecektir.

Bu sorunuda <%@ OutputCache Duration=”30″ VaryByParam=”CatID” %>  kodu içersinde belirttiğimiz VarybyParam değeri ile düzenleyebiliyoruz. Bu değer bize cache işleminin hangi parametrelere göre yapılacağını belirttiğimiz bir değer. Buna göre VaryByParam değerine querystring deki kategoriID sini taşıyan parametreyi verirsem kategoriler sayfasında kategorilerden hangisine tıklarsam tıklayayım diğer sayfadaki cache işlemi o kategoriID sine göre düzenlenerek bize farklı kategorilerdeki ürünlerinde görüntülenmesini sağlayacaktır.

Her zaman kategori bilgisini farklı sayfadan göndermeyebiliriz. Bir sayfa içersinde bir dropdownlist içersine listelenmiş kategori bilgileri ilede aynı sayfa üzerinde ilgili ürünleri listelediğimizi varsayarsak. Aynı  yöntemle yapmaya kalkarsak yine sorun çıkacaktır çünkü burada parametre olarak querystring kullanmıyoruz bir kontrol kullanıyoruz. Bu kez ise VaryByParam yerine VaryByControl kullanıyoruz.  <%@ OutputCache Duration=”30″ VaryByControl=”DropDownList1″ %>

Parametrenin hangi değere göre cache işlemine gireceğini değeri nereden alacağını belirtmiş oluyoruz. Böylece aynı sayfa içersinde bulunan controllerin durumuna görede cache işlemini şekillendirmiş oluyoruz.

Gelin biraz işin içine , işin dibine , işin altında yatan koca ayzberge (iceberg)  bakalım :D

OutputCacheModule ASP.Net içersinde bir HTTP Modul olarak implement olmuştur ve  System.Web.Caching namespace i içersinde yer alır. Bu modül sayfa içersindeki isteklerin yaşam alanı içersinde  gerçekleşecek olan olayları dinler ve ilgili bir olay(event) çalışırsa harekete geçer.HTTPModule  OutputCacheModule’ e ,  ResolveRequestCache ve UpdateRequestCache olayları ile katkıda bulunur.  ResolveRequestCache olayı tetiklendiğinde, modul gelen isteğin sonucunda dönecek olan sayfanın outputcache dahilinde olup olmadığına karar verir. Eğer cache işlemi varsa cache version bilgisi döner,cache bilgisi yoksa sayfa normal render edilir.  Geriye dönen cache bilgisine göre UpdateCacheModule çalışır. Bu modül çalıştığı zaman ise render edilen sayfa cache işlemine alınır.

Aşağıdaki diagram outputcachemodülünün çalışmasıyla ilgili bir fikir verecektir.

Başka yazılarda tekrar görüşmek üzere

Bilgiyle Kalın…
M.Zeki Osmancık

http://izmiradam.net/2010/10/asp-net-output-cache/

C# | Değişkenler ve Veri Tipleri

Posted by mezo | Posted in Introduction | Posted on 01-10-2010-05-2008

0



Merhaba arkadaşlar bu yazımda sizlere değişkenler denilen yapıları anlatmaya çalışacağım. Haydi başlayalım ;)

Değişken nedir nasıl tanımlanır?
Bir program çalıştırırken tüm veriler geçici olarak hafızada tutulur. Değişkenler bu verilerin isimlendirilmesi işlemidir. Değişken mantığı günlük yaşamdada çok kullanılan bir mantıktır aslında. Aklımızdan iki sayı tutmamız istendiğinde ve bu sayılarla alakalı işlem yapmamız istendiğinde aslında isimlendirecek olursak sayi1 ve sayi2 olarak o sayıları aklımızda tutuyoruz. İşte bu sayi1 ve sayi2 sadece o an geçiçi bir süre içinde işlem yapmamız için kafamızda ürettiğimiz değişkenlerdir. Programlamadada geçiçi olarak veri tutmak istediğimizde değişkenleri kullanırız.
<veri tipi> <değişken adı>; şeklinde tanımlanırlar.
string isim;
int rakam;
Tanımlama Kuralları
•Tanımlanan değişkenlerin tipleri değişken isminden önce belirtilir.
•Değişken isimlerini belirlerken bazı noktalara dikkat etmek gerekir. Boşluk, nokta, soru işareti, noktalı virgül, çift tırnak, tek tırnak, aritmetik  operatörler, karşılaştırma ve atama operatörleri, parantezler kullanılamaz.
• Sayı ile başlayamaz.
•Visual C#.NET dilinde tanımlı anahtar kelimeler kullanılamaz.
•Değişken isimlerinde Türkçe karakter kullanılırsa, farklı dil seçenekli işletim sistemlerinde çalışma anında hata üretecektir.



Veri Tipleri

Değişkenler program içinde, tuttukları verilere ulaşmak için kullanılır. Ancak değişkenlere ulaşmak, tanımlandıkları yerde veya alt  bloklarda mümkündür. Bu kavrama değişkenlerin kapsam alanı (Scope) denir.
Kapsam alanı dışındaki bir yerden değişkene ulaşılamaz.

Veri tipi, değişkenlerin tuttukları değerlerin türünü ve bellekte tutulacak boyutunu tanımlar. Değişkenleri veri tipleri ile tanımlarken verinin  boyutuna göre bir veri tipi seçilmelidir. İki tip veri tipi mevcuttur Değer Tipleri (Value Type)  ve Referans Tipleri (Reference Type)

Değer Tipleri (Value Type)

Değer tipleri veriyi direk olarak bellek bölgesinden alırlar

Referans Tipleri (Reference Type)