C# Generic Kolleksiyon Sınıfları



Bu yazımızda C# 2.0 ile birlikte C# diline eklenen Generic yapıları kullanılarak geliştirilmiş olan bazı koleksiyon tabanlı nesneleri ve generic yapıların avantajlarına bakacağız.

ArrayList liste = new ArrayList();
liste.Add(5);
liste.Add("generic");

Örneğimizde System.Collection isim alanından türeyen ArrayList sınıfını kullanarak liste adında bir kolleksiyon tanımladık ve bu kolleksiyona int tipinde 5 ve string tipinde "generic" değerlerini ekledik. Görüldüğü gibi iki farklı tür olmasına rağmen ArrayList'e bu iki değeri atayabildik. Çünkü ArrayList değerleri obje tipinde depo eder bu yüzden istediğimiz kadar farklı türü Add metodu ile ekleyebiliriz.

int a = (int)liste[0];
string b = (string)liste[1];
Ama kolleksiyondan bu değerleri çekip bir değişkene atamak istiyorsak bir casting işlemi yapmak gerekmektedir. Yani obje veri türünü int veri türüne çevirmemiz gerekmektedir. Buna C#'ta boxing işlemi denmektedir. Referans tipi olan obje ile değer tipi olan int belleğin farklı bölümlerinde bulunmaktadır. Bu yüzden bu işlem bizim için büyük bir performans kaybıdır. Generic kolleksiyon sınıfları bu soruna yanıt getirmiştir.

List<string> liste = new List<string>();
liste.Add("safak");
liste.Add("unel");

Örneğimizde yine liste tipinde bir koleksiyon tanımladık ama bu sefer bu koleksiyon System.Collections.Generic isim alanı altından tanımlandı. Yani generic bir koleksiyondur. Kolayca görüleceği gibi generic koleksiyonların farkı tanımladığımızda hangi tür nesneler içereceğini vermemizdir. Örneğimizdeki liste koleksiyonu string tipinde nesneler tutan bir koleksiyondur çünkü koleksiyonumuzu tanımlarken büyük küçük işaretleri arasına yazdığımız string bize bu koleksiyonun sadece string tipinde nesneler tutacağını belirtir. Şimdi bu koleksiyondan çektiğimiz bir nesneyi nasıl bir değişkene atıyoruz ona bakalım.


C# Generic Kolleksiyon Sınıfları,generic,kolleksiyonlar

Resimde görüldüğü gibi string tipindeki a değişkenine listenin herhangi bir değerini atamak istediğimizde karşımıza çıkan ToolTip bize listenin string tipinde bir değer döndürdüğünü söylüyor. Bu durumda artık bizim ilk örneğimizdeki ArrayList'te olduğu gibi bir casting yapmamıza gerek yok. Yani:

string a = liste[0];

dememiz bizim liste koleksiyonumuzun 0. indeksindeki değeri a değişkenine atamamız için yeterli. Casting'e gerek yok çünkü liste koleksiyonumuzun string tipinde bir değer döndüreceğiniz biliyoruz. Bu şekilde unboxing yapmadığımız yani objeyi stringe çevirmeye çalışmadığımız için herhangi bir performans kaybıda yaşamayız. Generic kolleksiyonların hayatımızı kolaylarştıran en önemli özelliğide budur..

Dictionary Kollesiyonunun Kullanımı:

C# Koleksiyonlar(System.Collection) yazımda bahsettiğim HashTable'ın generic halidir. Örnek bir HashTable tanımı yaparsak:

Hashtable hashTable= new Hashtable();
hashTable.Add("5", "unel");
hashTable.Add("4", "blog");
hashTable.Add("1", true);
hashTable.Add("3", "safak");
hashTable.Add("2", "2");
hashTable.Add("6", 123);
Görüldüğü gibi HashTable kollesiyonu hem string hem boolean hemde int türünden nesneleri ayni anda tutmaktadır. Çünkü generic olmadığı için tüm bu nesneleri obje olarak saklamaktadır. Dictionary kollesiyonuda ayni HashTable gibi key/value ikili matığıyla çalışmaktadır fakat generic olduğu için key ve value parametrelerinin hangi değer tipi olcağı tanımlama yapılırken verilmektedir. Bir örnek verecek olursak :

C# Generic Kolleksiyon Sınıfları,generic,kolleksiyonlar,Dictionary kullanımı
görüldüğü gibi tanımlamaların ardından artık yeni bir değer eklerken ToolTip bize key değerinin int tipinde , value değerinin ise string tipinde olacağını söylemektedir. Tanımlama :

            Dictionary<int, string> genericDictionary = new Dictionary<int, string>();
            genericDictionary.Add(0, "safak");
            genericDictionary.Add(1, "unel");

genericDictionary isminde tanımladığımız Dictionary kolleksiyonumuza tanımlama esnasında key değerinin int, value değerinin ise string tipinde olacağını büyük küçük işaretleri arasına yazarak belirtmiş olduk. Yani bundan sonra genericDictionary'a yeni bir değer eklerken key değerini int, value değerini ise string tipinde vermek zorundayız. Bu şekilde genericDictionary'dan bir değer çekersek dönecek value değerinin string tipinde olacağını biliriz ve casting işlemi yapmadan yani herhangi bir performans kaybına uğramadan bu koleksiyon üzerinden istediğimiz herhangi bir değeri string tipinde bir değişkene atayabiliriz.

Kısaca Generic kolleksiyon yapılarının özellikleri ve yararları bunlar umarım generic kolleksiyonlar bize ne kadar yararlı olduysa bu yazıda size o kadar yararlı olmuştur. Hoşçakalın..


C# Code Snippets



Devamlı kullandığımız if döngüsü olsun, for,foreach yapıları olsun bunları yazmak devamlı yazmış olsak bile zaman alan bir işlemdir. Visual Studio bunları yazarken bize kolaylık olsun diye IntelliSense'in yanından snippets kavramını ortaya çıkarmıştır. Bu snippets yapısı bize devamlı kullanıdığımız kod parçacıklarını kolayca yazmamızı sağlar. Visual Studio ile gelen hazır snippetlar olduğu gibi kendimizde snippet oluşturup bunu projemizi yazarken kullanabiliriz.

Peki hazır olan if,foreach,for gibi snippetları kullanmak için neler yapmalıyız? Bunun için kod yazarken "foreach" yazıp TAB tuşuna iki kere basmak yeterlidir.

C# Code Snippets,C# Code Snippet,C# Code Snippets kullanımı,C# Code Snippets yaratma,code snippet,code snippets

C# Code Snippets,C# Code Snippet,C# Code Snippets kullanımı,C# Code Snippets yaratma,code snippet,code snippets
Fotograflardaki örneklerde görüldüğü gibi "foreach" yazıp TAB TAB yapınca VS bize foreach yapısının örnek bir kullanımını oluşturdu bize kalan sadece bu yapıyı kendi programımıza göre değiştirip kullanmak. Böyle devamlı kullandığımız şeyleri snippet ile kullanmak bize çok büyük bir zaman kazandıracaktır. Peki diyelim ki MessageBox kontrolünü çok kullanıyosunuz ve bunun snippeti yok bu durumda ne yapacaksınız? Bunun için VS bize kendi snippet'larımızı oluşturup kullanma olanağı sağlıyor.

Snippet Oluşturmak :

Bunun için ilk yapmamız gereken bir xml dosyası açıp uzantısını .snippet olarak değiştirmek. Ardından aşağıda örneğini gördüğünüz kod gibi bir xml formatlı snippet tanımı hazırlamak.


C# Code Snippets,C# Code Snippet,C# Code Snippets kullanımı,C# Code Snippets yaratma,code snippet,code snippets

Buradaki xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet" snippet için xml şemamızdır bunu eklememiz bize hangi snippet dosyası oluştururken hangi tabların olduğunu gösteren IntelliSense'ı yükleyeceği için önemlidir.

Bu örnek ile artık kodumuz içerisine uzun uzun MessageBox kodu yazmak yerine ShortCut olarak verdigimiz mb stringini kullanarak Default olarak vediğimiz "Hello World" stringini içeren MessageBox kontrolu mb yazıp TAB TAB dersek çıkacaktır. MessageBox.Show(); içerisindeki $message$ ID olarak verdiğimiz "message"ın Default'u "Hello World"ü parametre olarak alır.

Fakat bu kodu yazmak bizim snippet'ımızın çalışacağı anlamına gelmez bunun için bu snippeti yüklememiz gerekmektedir. Bunun için yapılması gereken Tools -> Code Snippets Manager diyip snippets dosyamızı import etmemizdir.


C# Code Snippets,C# Code Snippet,C# Code Snippets kullanımı,C# Code Snippets yaratma,code snippet,code snippetsC# Code Snippets,C# Code Snippet,C# Code Snippets kullanımı,C# Code Snippets yaratma,code snippet,code snippets

 Dosyamızı bulup import işlemini yapmamızın ardından artık snippets dosyamız içerisinde tanımladığımız snippetları kullanmaya başlayabiliriz.

C# Configuration File (App.config,Web.Config,..) Dinamik Olarak Yazmak



Uygulamalarımızın konfugrasyon bilgilerini yani connection stringlerini, hostname gibi application settinglerini ve benzerlerini kaydettiğimiz web.config, app.config, machine.config gibi configuration dosyaları vardır. Uygulamamız çalışmadan önce bir çok ayarı bu dosyalara kaydederiz. Bu dosyaların en büyük yararı program içerisinde bir çok yerde kullanacağımız bilgileri bu dosyalara kaydedip istediğimiz zaman cağırabiliyor olmamızdır. Bunun bize en büyük artısı mesela connection stringimizi buraya değilde hard-code olarak programımıza yazdık. Bir çok yerde vertabanı bağlantısı yapacağımız için connection stringte herhangi bir değişiklik yapacaksak teker teker kod içinde nerelere yazdığımızı bulmamız gerekecekti. Fakat configuration dosyaları sayesinde sadece burda değiştirisek her yerde değiştirmiş olacağız.

Configuration dosyalarına kısa bir giriş yaptıktan sonra asıl konumuza gelelim. Bu configuration dosyalarını uygulamamızın çalışması esnasında değiştirmek istersek ne yapmalıyız? Uygulamamızın bir web uygulaması olduğunu düşünerek anlatacağım. Web uygulamalarında configuration dosyası olarak web.config dosyası bulunmaktadır. Ama uygulamanın çalışması esnasında bu dosyada bir değişiklik yaparsak uygulamamızın restart edilmesi gerekmektedir. Bu yüzden dinamik olarak configuration dosyasında değişiklik yapmak istiyosak direk olarak web.config üzerinde değişiklik yapamayız bu durumda projemize yeni bir configuration dosyası eklememiz gerekmektedir. Bunun için Item -> New Item ile kolayca yapabiliriz.


Yukardaki resimde görüldüğü gibi mysettings.config adında yeni bir configuration dosyası eklemiş olduk. Öncelikle bu mysettings.config dosyasını web.config dosyası içinde tanımlamamız gerekmektedir.
<appsettings configsource="mysettings.config"/>
                      web.config dosyası

bu tanımlamayı yaptıktan sonra mesela mysettings.config dosyasına hostname'imizi kaydetmiş olalım.
<appSettings>

    <add key="hostName" value="http://safakunel.blogspot.com"/>

  <appSettings>
                            mysettings.config dosyası

Şimdi bu tanımladığımız hostName'imizi programda dinamik olarak değiştirelim:
   Configuration c = WebConfigurationManager.OpenWebConfiguration("~");

    AppSettingsSection s = (AppSettins)c.GetSection("appSettings");

    s.Settings["hostName"].value = "http://www.safakunel.com";

    c.Save();

buradaki OpenWebConfigration içindeki "~" karakteri o dizindeki configuration dosyası anlamına geliyor. Daha sonra appSettings içindeki hostName'e ulaşıp "http://safakunel.blogspot.com" olan hostName'i "http://www.safakunel.com" olarak dinamik bir şekilde programın çalışma esnasında değiştiriyoruz. Son olarak bu işlemleri yapabilmemiz için System.Web.Configuration namespace'ini kullanmalıyız bunu unutmayalım. Bu şekilde C# bize dinamik bir şekilde configuration dosyalarına müdahale şansı tanıyor. Hoşçakalın..

C# Localization (Çok Dillilik)




Uygulamalarımızı eskiden çok dilli şekilde yazmak istediğimizde bunun çok zor bir işlem olduğunu bir önceki yazımda bahsetmiştim. Şimdi bunu resource dosyalarını kullanarak nasıl kolay bir şekilde yapabiliriz ona bir göz atacağız.

Bunun için resource C# Resource Kullanımı yazımda bahsettiğim gibi projemize iki resource dosyası ekleyelim. Bunların isimlerine

Localization.resx (Localization.tr-TR.resx default olarak Türkçe kullandığımız için bu şekilde yazmamıza gerek yoktur ama yazabilirizde)
Localization.fr-FR.resx

verelim. Ardından bu Localization.resx dosyamıza key olarak Title değer olarakta "Merhaba" değerini verip kaydedelim. Daha sonra Localization.fr-FR.resx dosyamıza geçerek yine Title'ı key olarak verip değer olarakta "Bonjour" değerini verelim.

C# Localization (Çok Dillilik),C# Resources,C# Localization,Çok dillilik


                                                 Lokalization.resx Dosyasının Görünümü

C# Localization (Çok Dillilik),C# Resources,C# Localization,Çok dillilik


                                                  Lokalization.fr-FR.resx Dosyasının Görünümü

Bunu yaptıktan sonra artık programımızda bununları kullanalım :


Localization.Culture = new CultureInfo("fr-FR");
string frTitle = Localization.Title;
Localization.Culture = new CultureInfo("tr-TR");
string trTitle = Localization.Title;
kod parçacığını incelersek Localization.Culture = new CultureInfo("fr-FR"); diyerek dili Fransızcaya set etmiş oluyoruz ve bundan sonra resx dosyamızın ismi olan Localization diyip bunun içine Title keyi ile kaydettiğimiz değeri çağırırsak otomatik olarak dili fransızcaya set ettiğimiz için Lokalization.fr-FR.resx dosyasına bakarak frTitle stringine "Bonjour" değerini atıyor. Yani bundan sonra resource dosyamızdan ne çağırırsak çağıralım dili Fransızcaya set ettiğimiz için uygulamamız Lokalization.fr-FR.resx dosyasına bakacaktır.Daha sonra Localization.Culture = new CultureInfo("tr-TR"); diyerek dili yeniden Türkçeye set ediyoruz. Bu durumda da artık Lokalization.fr-FR.resx dosyasına değil Lokalization.resx dosyasına bakıyor ve trTitle stringine "Merhaba" değerini atıyor.

Bu şekilde iki veya kaç dil desteği vermek istiyorsanız o sayıda resx dosyası oluşturup ayni parametrelerle çevirilerini yaparsanız çok dilli bir program çok kolay bir şekilde yazmış olursunuz. Hoşçakalın..


100. Yazımın Şerefine..CHEARS!



3 Kasım 2008'de ilk yazımı yazmıştım o günden bu güne 1.5 yıla yakın bir süre geçmiş ve bugün 100. yazımı yazdım. Bundan önce defalarca neden blog yazdığımı söylemiştim ama yazdıklarımı düşününce kendim için not alıyorum diyebilirim sanırım. Biraz bencilce oluyor ama doğrusu bu. Fakat bunu yaparken evde duran boş bir kağıda not almak yerine buraya alıyorum. Mesela programlama çalışıyorum bitince bir daha geri dönmek için öğrendiklerimi buraya yazıyorum, şiir yazmak istiyor canım buraya karalıyorum bla bla bla.. Bunun artısı benim için bir hatırlatma aracı olan bu blog buraya gelenler için öğrenme aracı oluyor. Bu bloğu açtığımdam bu güne 10.209 kez okunmuş. Okuyan herkese teşekkürler..Umarım yardımcı olabilmişimdir veya okuduklarını beğenmişlerdir.

Yakında safakunel.com olarak yayına devam edecek bloğumu okuyan herkese bir kez daha teşekkürler hoşçakalın..

Şsfak ÜNEL

C# Localization (Yerelleştirme - Dil ve Kültür Desteği) Kullanımı



Önceleri bir programı farklı dillerde yazmak çok zordu. Programlar farklı diller için farklı şekillerde ayrı ayrı yazılırlardı. Yani 2 dil desteği veren Türkçe ve İngilizce destekli bir program yazacağınızı düşünün ayni kodları iki kez yazmanız gerekecekti. Localization sadece çeviri olarak düşünülmemesi gerekir. Çünkü farklı dillerde mesela en basitinden nokta ve virgülün anlamı farklı olabilir veya saatin gösterimi, tarihin gösterimi farklı olabilir. Localization bize tüm bu değişiklikleri yapma imkanı vermektedir.

Bir uygulamanın dil desteği ve kültür desteği vermesi için ise, framework içinde yer alan System.Globalization isim alanındaki sınıflardan ve resource files dediğimiz kaynak dosyalarından yararlanılır. Bir başka deyişle, bir uygulamanın yerelleştirilmesi yani dil desteği ve kültürel desteğin sağlaması için, uygulama kodları ile destek birimleri birbirinden ayrı tutulmuştur. Böylece, bir uygulamayı çok sayıda kültür için yerelleştirmek mümkün olmaktadır.

IETF tarafından belirlenmiş RFC 1766 standartlarına göre kültürler doğal (neutral) ve alt (specific) kültür olmak üzere iki parametreyle isimlendirirler. Fransa örneğine bakarsak :

fr - FR : Fransa
fr - BE : Belçika

bu örneklerde RFC 1766 standartlarına göre Fransızca okunaşan iki ülke olan Fransa ve Belçika'nın nasıl isimlendirildiğini görüyoruz. İlk sıradaki fr doğal (neutral) FR ve BE ise alt (specific) kültürleri gösterir.

Kültürel Bilgilerin Listelenmesi:

CultureInfo[] kulturBilgiListesi=CultureInfo.GetCultures(CultureTypes.AllCultures);

AllCultures: Tüm kültürleri listeler.
InstalledWin32Cultures: Windows sistemlerinde kullanılan kültürleri listeler.
NeutralCultures: Sadece dille ilişkilendirilmiş doğal kültürleri listeler.
SpecificCultures: Alt kültürleri listeler.

Peki bu kültürler ile programımızı nasıl yerelleştirecez? Bunun için:

Thread.CurrentThread.CurrentCulture=guncelKultur;

Bu kod satırı ile, çalışan thread için kültür değeri, seçilen kültüre göre ayarlanmıştır. Dolayısıyla bu kod satırını izleyen satırlardaki sayısal değer, tarih ve zaman formatları, seçilen kültüre göre ekrana gelecektir. İşte bu şekilde programımızı basit bir şekilde yerelleştirmiş olduk. Bundan sonraki yazımda resources dosyalarıyla uygulamalarımıza nasıl çoklu dil desteği verebiliriz bunu öğrenip yazmaya çalışacağım. Umarım bu yazı şuan okuyan kişiye yardımcı olmuştur. Hoşçakalın..

Kaynak : Burak Selim Şenyurt : Localization (Yerelleştirme) - 1

C# Resources Kullanımı



Bir uygulamada kullanıdığımız kaynakları düşünürsek bunlar resimler,sesler ve yazılar(string) olabilir. Bu kaynakları bir pathden okutmak resource kullanmadan programımızı yazarken yapabileceğiz bir yaklaşımdır. Fakat en basitinden programımızın logosunu bir path içine attık oradan okuyoruz diyelim bu programı başka bir bilgisayara kurduğumuzda ayni pathi oraya taşımak zorunda olacağımızı gösterir veya taşıdık diyelim yalnışlıkla silinme tehlikesi vardır. Bununla birlikte derlenmiş programımızın farklı dillerdeki versiyonları olabilir. Bu durumda her dil için bir string kaynak dosyası(resource file) hazırlamamız yetecektir.

Kısacası resource yönetimi bize istediğimiz kaynakları exe içerisine gömmemize olanak sağlar. Resource dosyaları *.resx ve *.resource uzantılıdır. Şimdi bunları nası projemize ekleriz ve kullanırız onu bir görelim.

Resx uzantılı dosya Xml tabanlı bir dosyadır. Kaynak değerleri anahtar-değer çiftleri şeklinde saklar. Xml tabanlı oluğu için programcılar tarafından kolayca okunabilir. Assembly içerisine doğrudan eklenmezler.

Assembly içerisine doğrudan eklenen dosya kaynakları binary formatta tutan resource uzantılı dosyadır.

Aslında System.Resource altında bulunan ResourceWriter sınıfı ile kod ile bu kaynakları projemize ekleyebiliriz ama tabiki Visual Studio IDE'miz ile bu çok daha kolay bir şekilde yapılabilmektedir. Şimdi gelin buna bir bakalım :

Bunun için öncelikle projemize sağ tıklayıp Add -> New Item diyerek yeni öğe ekleme ekranına gelmeliyiz.

C# Resources Kullanımı,.Net Resource Yönetimi,resx,resources

Ardından açılan öğe ekleme ekranından Resources File seçerek programımıza *.resx uzantılı dosya ekleriz.

C# Resources Kullanımı,.Net Resource Yönetimi,resx,resources


*.resx dosyasını ekledikten sonra bize sadece istediğimiz kaynakları bu dosyaya eklemek kalıyor. Bunun için oluşturduğumuz resx dosyasını çift tıklayıp açmamız ve Add Resource tabını kullanabiliriz.


C# Resources Kullanımı,.Net Resource Yönetimi,resx,resources

Görüldüğü gibi Add Resource tabıyla resource dosyamıza istediğimiz kaynakları ekleyebiliriz. Bu kaynakları eklediğimizde Solution Explorer’ da Resources isimli bir klasör açıldığı göreceksiniz. Kaynak olarak eklediğimiz tüm dosyalar bu klasör altına otomatik olarak taşınacaktır.

C# Resources Kullanımı,.Net Resource Yönetimi,resx,resources



Peki Resources klasörümüz burda, resx uzantılı dosyamız burda peki kaynakları binary formatında saklayan resources uzantılı dosyamız nerede? Bu dosya obj klasörü altındaki debug klasörüne otomatik olarak atılmaktadır. Bu resources dosyamız Projemizinismi. + resx dosyamıza verdiğimiz isim + .resources şeklinde isimlendirilir. Mesala bizim örneğimizde yaratılan resources dosyasının ismi WindowsApplication2.Resource2.resources olmuştur. Bu işlemleri doğru bir şekilde yaptıysak şu anda resoruce dosyamız içerisinde yer alan kaynaklar exe uzantılı assembly içerisine dahil edilmiştir. Buda, uygulamamızın exe dosyasını alıp başka bir adreste (örneğin başka bir makinede) çalıştıracak olursak, assembly içerisine gömülen kaynakların kullanılabileceği anlamına gelmektedir. 

C# Resources Kullanımı,.Net Resource Yönetimi,resx,resources


ResourceManager  

Assembly içerisine gömülen kaynak dosyalarına ulaşabilmek için ResourceManager sınıfından yararlanırız. Mesela örneğimizde deneme.gif dosyasını eklemiştik şimdi bu resim dosyasına nasıl ulaşıp ele alabiliriz onu bir görelim :

ResourceManager resManager = new ResourceManager("WindowsApplication2.Resource2", Assembly.GetExecutingAssembly());
pbImage.Image=(Bitmap)resManager.GetObject("deneme");
resManager.ReleaseAllResources();
 
Burada deneme bir resim dosyası olduğu için resources dosyası içinde binary şekilde yer olur o yüzden örneğimizde bu resmi bir PictureBox içerisine atamak için Bitmap'e çevirmemiz gerekmektedir. Resources içerisinden bir string çekmek istiyorsak böyle bir şeye ihtiyaç duymayacaktık.

Bir yazımızında daha sonuna geldik. Bu yazımızda Resources kullanımıyla ilgili bir giriş yaptık. Bir sonraki yazım yine Resource kullanımı ile ilgili olacak bu sefer resources dosyalarını kullanarak nasıl Localization işlemleri yapılır bunu öğrenip anlatmaya çalışacağım. Bu yazı bloğumdaki 100. yazı olmasından dolayı önemli bir yazıydı benim için ayni zamanda da hem benim için hem sizin için yararlı olacağına inanıyorum. Umarım yararlı olmuştur herkes için..Hoşçakalın..

Yararlanılan Kaynaklar : Burak Selin Şenyurt: İlk Bakışta .Net Resource Yönetimi


C# XmlReader Kullanımı



XmlReader programlarınızın XML okumasını sağlar. Çeşitli metod ve propertylere sahiptir. Bunlara bir göz atacak olursak :

Metodlar:

Read: XML dökümanı üzerindeki sıradaki element'i okumamızı sağlar.

Skip: Readerın üzerinde bulunduğu element'in sıradaki child elementini'unu okumadan geçmemizi sağlar.

MoveToNextAttribute: Reader'ı üzerinde bulunduğu child elementin üzerinde bulunan attribute'ten bir sonraki attribute konumlanmasına sağlar

Properties:

Name: Üzerinde bulunduğu node'un adını döndürür.

Value: Üzerinde bulunduğu node'un değerini döndürür.

NodeType: Üzerinde bulunduğu node'un tipini döndürür.

Örnek Kullanım :


C üzerinde bulunan test isimdeki xml dosyasını okuyup result adındaki değişkene atayan örnek bir kod yazacak olursak:

            using System.Xml;
            string result = "";
            XmlReader xmlReader = XmlReader.Create("C://test.xml");
            while (xmlReader.Read())
            {
                result += (xmlReader.Name + "=" + xmlReader.Value);
            }
            xmlReader.Close();
Bununla birlikte xml dosyalarını okurken xml okuyucumuza çeşitli ayarlar yapılandırabiliriz. Bunu XmlReaderSettings sınıfı ile yapabiliriz. Bu sınıfın önemli propertyleri:

IgnoreComments: Xml dökümanın içeriğindeki yorumların okunup okunamaması ayarının yapıldığı property.

IgnoreWhitespace: Xml dökümanın içeriğindeki boşluk karakterinin okunup okunamaması ayarının yapıldığı property.

CheckCharacters: Xml dökümanın içeriğini okurken karakter kontrolünün yapılıp yapılmaması ayarını yapabileceğiniz property.

şimdide xml okuma kodunumuzu okuyucumuza bazı ayarlar ekleyerek nasıl yazılır onu görelim:

            XmlReaderSettings xmlReaderSett = new XmlReaderSettings();
            xmlReaderSett.IgnoreComments = true;
            xmlReaderSett.IgnoreWhitespace = true;
            xmlReaderSett.CheckCharacters = true;

            string result = "";
            XmlReader xmlReader = XmlReader.Create("C://test.xml",xmlReaderSett);
            while (xmlReader.Read())
            {
                result += (xmlReader.Name + "=" + xmlReader.Value);
            }
            xmlReader.Close();
Bu yazımızında sonuna geldik. Umarım size yardımcı olabilmişimdir.

C# ExecuteScalar, ExecuteNonQuery ve ExecuteReader Kullanımı



C# uygulamalarımızda veritabanıyla ilgili bir sorgu yazdırdığımızda bu sorguyu çalıştırmak için C# bize çeşitli metodlar sunmuştur. Bunlar :

ExecuteScalar : Sorgumuz scalar tek bir değer döndürüyorsa sorgumuzu bu metod ile çalıştırmakta sorgu hızı bakımından fayda vardır.

ExecuteNonQuery : Sorgumuzda UPDATE, DELETE gibi işlemler yapıyorsak bu metodu kullanmalıyız. Ayrıca bu metod ektilediği kayıt sayısını döndürür.

ExecuteReader : Eğer sorgumuzda bir tablo için SELECT işlemi yaptıysak SELECT attığımız kayıtları okumak için bu metodu kullanmalıyız.


ExecuteScalar kullanımı ile ilgili örnek

mySqlConnection.Open();
mySqlCommand.Connection = mySqlConnection;
mySqlCommand.CommandType = CommandType.Text;
mySqlCommand.CommandText = "SELECT COUNT(ID) FROM DENEMETABLE";
int count = (int) mySqlCommand.ExecuteScalar();

ExecuteNonQuery kullanımı ile ilgili örnek

mySqlConnection.Open();
mySqlCommand.Connection = mySqlConnection;
mySqlCommand.CommandType = CommandType.Text;
mySqlCommand.CommandText = "UPDATE DENEMETABLE SET WEBSITE = 'safakunel.blogspot.com' WHERE ID = 1";
mySqlCommand.ExecuteNonQuery();
int etkilenenKayitSayisi = mySqlCommand.ExecuteNonQuery();

ExecuteReader kullanımı ile ilgili örnek

mySqlConnection.Open();
mySqlCommand.Connection = mySqlConnection;
mySqlCommand.CommandType = CommandType.Text;
mySqlCommand.CommandText = "SELECT * FROM DENEMETABLE";
SqlDataReader r = mySqlCommand.ExecuteReader();
while (r.Read())
{
//okunan satırla ilgili işlemler buraya yazılır.
}
r.Close();
mySqlConnection.Close();


C# Connection String App.config ve Web.config İçinde Saklamak ve Çağırmak



Eğer yazdığımız program bir veritabanına bağlanıyor ise bu bağlantıyı kurmak için bildiğiniz gibi bir ConnectionString kullanılır. Bu stringi hardcoded olarak bağlantı kuracağımız zaman yazabiliriz ama connectionString'de herhangi bir değişiklik yapmak zorunda kalırsak tüm programı tarayıp teker teker değiştirmemiz gerekecektir. Birde uzun bir program yazdığımızı düşünürsek bunu yapmak çok zor olacaktır. Bu durumu ortadan kaldırmak için bu stringi app.config ve web.cofig içerisinde saklayabiliriz. Böylece sadece buradan stringi değiştirmek bağlantı yaptığımız her yere etki edecektir.

Örnek:

<connectionstrings>
<add name="OrnekConnectionString"
connectionString="Data Source=(local);Initial
Catalog=AdvebtureWorks;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionString>

ConnectionString Çağırma:

using System.Configration;

string myConnectionString = CongifrationManager.ConnectionStrings[OrnekConnectionString];

bu şekilde app.config veya web.config dosyası içerisine sakladığımız connectionStringi programımızda tanımladığımız string tipindeki myConnectionString değişkenine atamış oluruz.


C# ErrorProvider Component Kullanımı



ErrorProvider componenti windows form uygulamalarında kullanıcıdan eğer değer alınıyorsa bu değerlerin kontrolü sonucu eğer bir hata var ise kullanıcıya hata döndürmek için kullanılır.

Örnek kullanım :

 if (Regex.IsMatch(nameTextBox.Text, @"^[a-zA-Z\s'.]{1-50}$"))
         errorProvider1.SetError(nameTextBox,"Hatalı isim!");

Görüldüğü gibi bu örnekte nameTextBoxkontrolüne girilen değer eğer regex'te belirtilen karakterler dışında ise "Hatalı isim!" hatası döndürmektedir.

Bu componente ait bazı property'ler:

Icon : Hata oluştuğunda çıkacak olan ikonun seçildiği property

BlinkStyle : Hatanın yanıp sönme şekli

BlinkRate : Hatanın yanıp sönme hızı

Bu component kullanarak ayrıca bir hata varsa o kontrole focus yapılması programın kullanım kolaylığı açısından önemli bir artıdır. Çünkü kullanıcı nerde hata yaptığını çok uzun formlarda aramak zorunda kalmayacaktır. Bunun için Focus() ve SelectAll() fonksiyonlarını kullanarak yapabiliriz.

Örnek kullanım:


 if (Regex.IsMatch(nameTextBox.Text, @"^[a-zA-Z\s'.]{1-50}$"))
         {
                  errorProvider1.SetError(nameTextBox,"Hatalı isim!");
                  nameTextBox.Focus();
                  nameTextBox.SelectAll();
          }
Ayrıca eğer hata ortadan kalktıysa bu componenti ortadan kaldırmak için değerini NULL yapmak yeterlidir. Yani :

errorProvider1.SetError(nameTextBox,"");
bu şekilde bu provider gözükmez.

GetError :

GetError metodu ile ekran üzerindeki herhangi bir konrolde hata olup olmadığı kontrolü yapılabilir. Bu metod o kontrolün hata mesajını döndürür eğer hata yok ise NULL döneceği için şu şekilde bir kontrol üzerinde hata olup olmadığı kontrol edilebilir.

String.IsNullOrEmpty(errorProvider1.GetError(nameTextBox));

Validation yapılırken kontrolün Validation Event kullanılabilir. Bir kontrolün

Validating
Validated

Eventları bulunur.


Validating - Validated:

//Kontrol yapılır
private void nameTextBox_Validating(object sender, CancelEventArgs e)
{
         if (!Regex.IsMatch(nameTextBox.Text, @"^[a-zA-Z\s'.]{1-50}$"))
         {
                  //Event iptal edilir
                  e.Cancel = true;
                  nameTextBox.Focus();
                  nameTextBox.SelectAll();
                  errorProvider1.SetError(nameTextBox,"Hatalı isim!");
          }
}

//Kontrol yapılıp hatasız geçildikten sonra çalışan Event
private void nameTextBox_Validated(object sender, EventArgs e)
        {
                 errorProvider1.SetError(nameTextBox,"");
        }

Bu yazımda windows form üzerinde yapılan validate işlemleri ile ilgili bilgi vermeye çalıştım umarım yardımcı olabilmişimdir.


C# Boolean Değer Döndüren Data Validation Fonksiyonları



Bu fonksiyonlar IsDate,IsNumeric,IsError ve IsNothing fonksiyonlarıdır. Bu fonksiyonları kullanabilmek için Microsoft.VisualBasic assembly si import edilerek Information sınıfı üzerinden çağırılır. Ayrıca Regex sınıfının IsMatch metoduda dataların kontorolu için kullanılır.

IsDate: Girilen değerin DateTime tipinde olup olmadığını kontrol eder. Gönderilen değer DateTime tipinde ise true değilse false değer döndürür.

IsError: Girilen değerin exception type tipinde olup olmadığını kontrol eder. Gönderilen değer exception type tipinde ise true değilse false değer döndürür.

IsNumeric: Girilen değerin nümerik olup olmadığını kontrol eder. Gönderilen değer nümerik ise true değilse false değer döndürür.

IsNothing: Girilen değerin Null olup olmadığını kontrol eder. Gönderilen değer Null ise true değilse false değer döndürür.

Regex sınıfının IsMatch metodunu kullanabilmemiz için System.Text.RegularExperessions namespace ini yüklememiz gerekmektedir.

Bazı Regular Expressionlar :

[\s] : boşluk
[\d] : numaralar
[a-zA-Z] : alfabetik harfler
{1,50} : 1 ila 50 arasındaki sayılar

Örnek bir kullanım :

             string userInput;

            // Regex ile yapilan data validation örneği
            if (Regex.IsMatch(userInput, @"^[a-zA-Z\s'.]{1-50}$"))
                System.Console.WriteLine("Doğru Giris");
            else
                System.Console.WriteLine("Yanlis Giris");

            //Microsoft.VisualBasic assembly i üzerindeki Information sınıfı kullanılarak yapilan validation örneği
            if (Information.IsNumaric(userInput))
                System.Console.WriteLine("Doğru Giris");
            else
                System.Console.WriteLine("Yanlis Giris");