Coder

29 Ocak 2013

Xml dosyasını veritabanı olarak kullanma

Xml ile az çok uğraşanlar bilir tanımını ne işe yaradığını. Onun için hakkında pek fazla konuşmayacağım. Yalnız tanımına ayrıkırı bir örnek paylaşacağım için bir şeyler söylemeden geçemeyeceğim.

Xml nedir diye sorunca hemen herkes wikipedia ’ya sarılır ve merakını giderir. Kullanımı hakkında yazılan yazıda; “Rastgele veri erişimine uygun olmadığından veri tabanı amaçlı kullanılmamaktadır.” ibaresi içermektedir. Bunun nedeni herhangi bir kısıtlama olmadan normal bir şekilde okunabilir olması.  Örneğin .mdb uzantılı database dosyasına sağ tıkladığımızda verileri okuyamıyoruz. Ancak xml basit bir not defterinde yardımıyla bile okunabilmekte.  Biz bu ibareyi es geçip xml dosyasını veritabanı olarak nasıl kullanırız basit bir örnekle öğrenelim.(Tanımda veritabanı olarak kullanamazsınız demiyor nede olsa)

xml-dosya-kayit

Xml dosyasını veritabanı veya sadece bir tablo olarak verimli bir şekilde kullanabilmek için database deki gibi tabloda her kayıtta artan id numarasına ihtiyacımız olacaktır. Bu ihtiyacı nasıl giderebiliriz, xml dosyasını nası veritabanı gibi kullanabiliriz, buyrun örnekte görelim..

veritabani-gibi-kullanma

Resimdeki gibi boş bir forma 2 button bir label ve bir adet textbox ekleyerek kod kısmına geçebiliriz. Öncelikle boş xml dosyası oluşturmak için btnXmlOlusutur isimli butonunun clik olayına gelerek alttaki kodları uygulayalım.

[cc lang='csharp' ] private void btnXmlOlusutur_Click(object sender, EventArgs e)
{
if (!File.Exists(“xmldosyam.xml”)) // Daha önceden dosyanın var olduğunu kontrol ettik. Dosya yoksa .xml uzantılı xmldosyam adında dosya oluşturma işlemine başladık.
{
XmlTextWriter xmlolustur = new XmlTextWriter(“xmldosyam.xml”, null); // XmlTextWriter sınıfından oluşturacağımız dosya özellikleri için nesne oluşturduk.

xmlolustur.WriteStartDocument();

xmlolustur.WriteComment(“Oluşturulan xml hakkında bilgi”); //// Dosya hakkında bilgi ekledik.

xmlolustur.WriteStartElement(“Baslangic”); // Başlangıç elementi gibi özellikleri ekledik.

xmlolustur.WriteEndDocument();
xmlolustur.Close();

label1.Text = “Dosya programın bulunduğu dizine oluşturuldu.”;
}
else
{
MessageBox.Show(“Oluşturulmadı”); // Daha önceden dosya varsa veya herhangi bir hatada buradaki mesajı verir.
}

}[/cc]

Gerekli kod açıklamaları kodlar içinde mevcut. (Anketten dolayı haddinden fazla detaya girdiğim için özür dilerim)

Dosya oluşturma işlemini yaptıktan sonra oluşturulan xml dosyamız içine standart bir veri tabanındaki tablo yapısı gibi otomatik artan id kolonlu kayıt gerçekleştirelim. Bunun için txtKayitAdi isimli metin kutumuza girilen karakteri xml dosyasına kayıt etme işlemine geçelim. Bunun için btnEkle isimli butonun clik olayına gelip alttaki kodları girelim.

[cc lang='csharp' line_numbers='true']
private void btnEkle_Click(object sender, EventArgs e)
{
bool varmi = false;
int enBuyukId;

XmlDocument doc = new XmlDocument(); // Xml dosyamızı okumak için XmlDocument sınıfından yararlanıyoruz.
doc.Load(“xmldosyam.xml”);
XmlElement root = doc.DocumentElement;
XmlNodeList kayitlar = root.SelectNodes(“/Baslangic/Kullanicilar”); // Xml içindeki istediğimiz kayıtlara ulaşabilmek için yolu tanımlıyoruz. Bunu veritabanı içindeki
// tablo olarak düşünebilirsiniz. Bu yol ile Kullanicilar tablosuna yani listesine ulaşıp kayıtları XmlNodeList sınıfından oluşturduğumuz kayitlar isimli

if (kayitlar.Count > 0) // Her yeni kayıta otomatik farklı id numarası verebilmek için bir önceki kayıtın id numarasına göre işlem yapmamız gerekecek. Burada ilk kayıt varmı kontrol ediyoruz. Varsa, kayıtlar içinde en büyük idyi yani numarayı bulup üzerine 1 ekletip yeni kayıt için hazırlıyoruz. Yoksa, daha önce kayıt oluşturulmamışsa ilk kayıt numarasını 0 atayıp kayıt için gönderiyoruz.
{
varmi = true;
}

if (varmi == true)
{
int[] kayittakiSayilar = new int[kayitlar.Count]; // Kayıt sayısı kadar dizi tanımaldık.

int i = 0; // Diziyi arttırmak için sayı tanımladık.
foreach (XmlNode secilen in kayitlar)
{
kayittakiSayilar[i] = Convert.ToInt32(secilen["id"].InnerText); // Kayıtlardaki tüm id yani numaraları kayittakiSayilar dizisi içine ekledik.
i = i + 1;
}

Array.Sort(kayittakiSayilar); // kayittakiSayilar dizisi içinde bulunan sayılardan en büyüğünü bulabilmek için Array sınıfını kullandık. Bulunan en büyük sayıya 1 ekledik.
enBuyukId = kayittakiSayilar[kayittakiSayilar.Length - 1];
enBuyukId = enBuyukId + 1;

}
else
{
enBuyukId = 0;
}

if (File.Exists(“xmldosyam.xml”)) // Xml dosyamıza kayıt eklemede hata almamak için dosyanın var olup olmadığını kontrol ediyoruz.
{

XmlElement UserElement = doc.CreateElement(“Kullanicilar”); // Veritabanından tablo ismi gibi düşünbebilirsiniz.

XmlElement id = doc.CreateElement(“id”); //Oluşturulan xml içindeki Kullanicilar elementine id isimli element (DB deki gibi düşünürsek Kullanicilar tablosuna id kolonunu ekliyoruz.)
id.InnerText = enBuyukId.ToString();
UserElement.AppendChild(id);

XmlElement adi = doc.CreateElement(“adi”); // İkinci elementi ekliyoruz.(Yani ikinci kolonu)
adi.InnerText = txtKayitAdi.Text;
UserElement.AppendChild(adi);

doc.DocumentElement.AppendChild(UserElement);

XmlTextWriter xmleekle = new XmlTextWriter(“xmldosyam.xml”, null);
xmleekle.Formatting = Formatting.Indented;
doc.WriteContentTo(xmleekle);
xmleekle.Close();

label1.Text = “Kayıt eklendi.”; // Kayıt işlemi başarılı bir şekilde bittikten sonra mesaj için label kullanabilirsiniz.
}
}
}
[/cc]

Gerekli kod açıklamalarını kodlar içinde bulabilirsiniz. Oluşturulan, xmldosyam.xml dosyasını programın exe sinin olduğu yerde bula bilirsiniz. Veya oluştururken, kayıt ekerken istediğiniz dosyaya koyup işlem yapabilirsiniz.   Bu gibi uygulamayı; telefon rehberi, gizlilik gerektirmeyen kayıt giriş çıkış gibi programlar için örnek alabilirsiniz.

Vb.net kodlarına ve yorum satırı olmayan kodlara ulaşmak için alttaki numaraları kullanarak diğer sayfaya geçebilirsiniz.

24 Ocak 2013

Dinamik buton oluşturup kontrol etme

Runtime zamanında bazen dinamik buton oluşturmak istemişizdir. Yada kod ile buton oluşturmak…  Buna, kullanıcının ihtiyacına karşı olarak projelerimizde kullanmaktayız.

dinamik-coklu-buton

Örneği anlamak için form ekranıına bir adet label, textbox ve buton resimdeki gibi oluşturup kodlamaya geçebiliriz. Kullanıcıdan alınan buton sayısı doğrultusunda form ekranın büyüklüğüne göre oluşturulan butonları boyutlandıra biliriz.

Boyutlandırmadaki amaç birden fazla buton eklendiği için normal şartlarda yan yana veya alt alta standart boyutta buton oluşturmakta. Hem bunları bir sıraya sokup hemde formun genişliğine ve yüksekliğini referans alarak butonları düzgün bir şekilde göstere biliriz.

[cc lang='csharp' line_numbers='false']
private void button1_Click(object sender, EventArgs e)
{
int butonSayisi = Convert.ToInt32(textBox1.Text);
int sol = 1; //formun sol tarafından atanan değer
int alt = 50; // formun üst tarafından atanan değer
int bol; // bolme işlemindeki amaç formun boyutuna göre butonları sıralı bir şekilde görebilmek için
bol = Convert.ToInt32(Math.Ceiling(Math.Sqrt(butonSayisi)));

for (int i = 1; i <= butonSayisi; i++) // girilen buton sayısına göre döngü şartı sağlanana kadar oluşturmakta { Button btn = new Button(); btn.Name = i.ToString(); btn.AutoSize = false; btn.Size = new Size(this.Width / bol, this.Height / (bol * 2)); btn.Text = "Buton " + i.ToString(); btn.Font = new Font(btn.Font.FontFamily.Name, 18); btn.Location = new Point(sol, alt); this.Controls.Add(btn); sol += btn.Width + 5; if (sol + this.Width / bol > this.Width) // bunu yapmasaydık butonlar yan yana dizilir alt satıra geçmedi
{
sol = 1;
alt += this.Height / (bol * 2) + 5;
}

btn.Click += new EventHandler(dinamikMetod); // dinamik olarak oluşturulan butonu kontrol etmek için her oluşturulan butonun clik olayına atıyoruz.

}
}

[/cc]

Kod içinde yeterli açıklama mevcut.  Genel olarak anlatırsak; form içinde butonları düzgün bir şekilde görünebilmesi için girilen buton sayısı değerinin Math.Sqrt ile kare kökünü alıp sonucun doğru bir şekilde çıkması için Math.Ceiling ile yuvarladık.  Bunu yapmamızın nedeni, kullanıcının girdiği buton sayısına göre butonların büyüklüğünü ayarlayabilmek. Bunu yapmasak kullanıcı 100 tane buton istese, buton büyüklüğünü önceden girdiğimiz için butonları çoğu taşacak veya üst üste gelerek kötü bir görüntü elde edeceğiz. Örneği uygulayarak konuyu anlayacağınızı umuyorum.

Dinamik olarak oluşturulan butonu nasıl yakalayabiliriz derseniz üst tarafta oluşturduğumuz butonlar içine atanan clik olayını metod yardımı ile yakalayıp, runtime da oluşturulan butona tıklanıldığında o butona ait isim, vs özelliklerine ulaşabiliriz. Bunun için alttaki kodları örneğimize dahil ederek konuyu öğrenebilirsiniz.

[cc lang='csharp' line_numbers='false']
protected void dinamikMetod(object sender, EventArgs e)
{
Button dinamikButon = (sender as Button);
MessageBox.Show(dinamikButon.Text + ” isimli butona tıkladınız”);
}
[/cc]

Burada tıklatılan butonun textini mesaj kutusunda gösterdik.

Aynı şekilde diğer kontrolleri de(label, combobox gibi) oluşturabiliriz.  Bu örnek uygulamayı nerede kullanabiliriz derseniz; adisyon programında işletme sahibinden girilen masa sayısını form ekranına gösterip, herhangi masa hesabını açmak ve kapatmak için kullanabiliriz.

21 Ocak 2013

Koşullu mesaj kutusu

Filed under: C# — Etiketler:, , , , — Murat M.oğlu @ 18:07

Herhangi bir uygulamada, kritik bir şey yaptığımızda program olayı tetiklemeden önce kullanıcıdan tekrar yapacağı olayı hatırlatmak için Evet/Hayır gibi koşullandırır.  Bu koşulun sonucunda kullanıcı emin olduğunu kabul edip gerekli olayı tetiklemekte.

messagebox-evet-hayir

Örneğin silinmesi gereken veriyi silmek için hazırlanmış bir butona tıklanıldığında kullanıcıya yaptığı işlemi hatırlatmak için  evet/hayır sorusu ile mesaj gösterilip koşulu kabul ettiğinde gerekli silinme işlemi başlar.

[cc lang='csharp' line_numbers='false']

private void button1_Click(object sender, EventArgs e)
{
if (MessageBox.Show(“Veriyi silmek istiyormusunuz ?”, “Uyarı !”, MessageBoxButtons.YesNo) == DialogResult.Yes)
{

//Evet…

}
else
{

//Hayır…

}
}[/cc]

20 Ocak 2013

Textboxa sadece harf veya rakam girme

Windows form projelerinde, web formundaki gibi kullanıcı kontrolleri gibi hazır bileşenler bulunmuyor. Haliyle yazılımcı kendi kontrol mekanizmasını kendisi yazmak zorunda kalıyor. Bunlardan bir tanesi de textbox metin kutusu kontrolü.

Windows formdaki textbox aracılığı ile kullanıcıdan kısıtlı veri isteyebiliriz. Örneğin telefon numarası girdisi veya yalnızca harflerden oluşan bir metin girdisi… Bu kısıtlamayı yapmak için kullanılan textbox ın KeyPress olayına aşağıdaki kodları kullanabilirsiniz.

Sadece harf girilmesini istiyorsanız ;

[cc lang='csharp' line_numbers='false']

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = !char.IsLetter(e.KeyChar) && !char.IsControl(e.KeyChar) && !char.IsSeparator(e.KeyChar);
}

[/cc]

Sadece sayı yani rakam girilmesini istiyorsanız;

[cc lang='csharp' line_numbers='false']

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar);
}

[/cc]

 

01 Ocak 2013

İlk harfi büyük sonrası küçük harf

Basit bir konu ile merhaba. X projesi üzerinde çalışırken kategori ekleme kısmında sonradan farkında olduğum bir hata ile karşılaştım.

Şöyle ki xml dosyası içine kayıt ettiğim  kategoriler haliyle aynı isimde olmaması gerekiyordu. Kontrol şartları sayesinde bu durumu çözülebilmekte. Ancak kullanıcı daha önceden küçük harfle eklediği kategoriyi tekrar büyük harfle yazıp eklediğinde, xml içinde database gibi  büyük-küçük harf duyarlılığı olmadığından büyük harfli aynı kategoriyi de eklemekte.

ilk-harf-buyuk

Örneğin xml kategori kayıtları içinde MEYVE ve meyve 2 tane aynı isimde kategori mantıken bulunmasını istemediğimiz halde bulunmakta. Bunu engellemenin yolu kullanıcının girdiği kelimenin, verinin vs. ilk harfini büyük yapıp kalan harflerini küçük yaptıktan sonra işleme koymak. Mesela,  kullanıcı ilk harfi küçük 2. harfi büyük gibi abuk sabuk veri de girebilir…

Hikaye böyle cereyan etmekte. Bu durumu düzeltmek için CultureInfo sınıfının CurrentCulture özelliğinden faydalanarak yapabiliriz. Örneği pekiştirmek için boş bir form üzerine textbox ve buton ekleyip buton clik olayına alttaki kodları yazalım. using System.Globalization; projenize eklemeyi unutmayın !

[cc lang='csharp' line_numbers='false']

string gelenYazi = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(textBox1.Text);

MessageBox.Show(gelenYazi);[/cc]

 

Powered by WordPress