25 Mart 2010 Perşembe

C# ile geçerli E-Mail adres kontrolü

Programımızda E-Mail gönderen bir fonksiyon varsa yapmamız gereken mail adresinin geçerli karakterleri barındırdığını ve doğru formatta olup olmadığını kontrol etmektir. Bunu kısa bir kod parçasıyla halledebilirsiniz. Bunun için RegularExpressions kullanıcam.
Bunun için gerekli olan using ifademiz System.Text.RegularExpressions;
private const string MatchEmailPattern =
                  @"^(([\w-]+\.)+[\w-]+|([a-zA-Z]{1}|[\w-]{2,}))@"
           + @"((([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?
                                                [0-9]{1,2}|25[0-5]|2[0-4][0-9])\."
           + @"([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?
                                                [0-9]{1,2}|25[0-5]|2[0-4][0-9])){1}|"
           + @"([a-zA-Z]+[\w-]+\.)+[a-zA-Z]{2,4})$";

Karakter ve format kontrolünü sabit bir string değişkenime atadım.
private string mail = emraheroglu@msn.com;
Sonra mail adresimi aynı şekilde bir string değişkene atadım.Son olarak buttonun Click eventine şu kodu yazın size dönen değere göre olumlu veya olumsuz mesaj kutuları alıcaksınız.
private void button1_Click(object sender, EventArgs e)
        {
            bool retVal = false;
            retVal = Regex.IsMatch(mail, MatchEmailPattern);
            if (retVal)
            {
                MessageBox.Show("OK");
            }
            else
            {
                MessageBox.Show("FAIL");
            }
        }
Uygulama Sonucu;
ok
Eğer mail adresimizi şu şekilde tanımlamış olsaydık.
private string mail = “emraheroglu@msn”;
sonuç false dönerek “FAIL” mesajımızı görecektik. Şimdilik bu kadar.Hoşçakalın..

24 Mart 2010 Çarşamba

“Syntax error: Missing operand after 's' operator.” hatası, nedeni ve çözümü

Merhaba,
image
Bu hata bir DataTable nesnesi içerisinde filtreleme yaparak DataRow Array’i elde ederken yazılan söz diziminden kaynaklanıyor. rowFilter işlemide diyebiliriz.  Özel bir karakter olan “ “  karakteri ( Apostrophe, Iyelik durumu, kesme işareti ) koşul içerisindeyse bu hatayı alabilirsiniz.

Örneğin,
DataRow[] rowList = resultDt.Select(string.Format(" [{0}] = '{1}'",resultDt.Columns["Company"],"Dyn's"));
Kod parçasında Company alanında "Dyn's" bulunanları ararken "Dyn's" içerinde ki kesme işareti bize sorun yaşatır.
Çözüm,
Replace() metodunu kullanmanız yeterli olacaktır. “ ” yerine “ ’ ’ ” ,yani kesme işareti yerine 2 tane kesme işareti kullanmak yeterlidir.
DataRow[] rowList = resultDt.Select(string.Format(" [{0}] = '{1}'",resultDt.Columns["Company"],"Dyn's".Replace("'","''")));
image 
Kolay gelsin..

C# ile pasta tablosu oluşturma (draw pie chart)

Bu yazımda size C#'ta Graphics nesnesini kullanarak excel ve word'den aşina olduğumuz chartlardan pie chartını oluşturacağım. Bir senaryomuz olsun ve bir sınıftaki öğrencilerin aldığı notların dağılımı gösteren bir tablo oluşturalım. Bunun için Windows Form Application kullanağız.Formumuzda öğrencilerin aldığı notları uygulamaya girebileceği 5 adet textbox kontrolü ekleyelim. Bu textboxların hangi notlara ait olduğunu bildiren labellarımız olsun. Birde formumuza notları grafiğe dönüştüren ve formumuzu temizleyen 2 adet button konulduğunda formumuzun tasarımı tamamdır.
Ekran görünümü aşağıdaki gibi olacak. Sağ tarafı biraz boş bırakın o boş kısımda tablomuzu göstereceğiz.
ex1
Kod kısmına geçebiliriz.
İlk öncelikle formun load eventinde pasta dilimimizde hangi dilimlerin hangi öğrenci grubunu temsil ettiğini anlmak için textboxların arka plan rengi değiştiriyorum.
private void Form1_Load(object sender, EventArgs e)
        {
            textBox1.BackColor = Color.Red;
            textBox2.BackColor = Color.Blue;
            textBox3.BackColor = Color.Yellow;
            textBox4.BackColor = Color.Green;
            textBox5.BackColor = Color.Orange;
        }
Daha sonra  Tamam butonunun click eventinde textboxlardan sayısal değerleri alarak bunları pasta diliminde yorumlanabilir bir şekle getiriyoruz.   
            int not1= 0;
            int not2 = 0;
            int not3 = 0;
            int not4 = 0;
            int not5 = 0;
            try
            {
                not1 = int.Parse(textBox1.Text);
                not2 = int.Parse(textBox2.Text);
                not3 = int.Parse(textBox3.Text);
                not4 = int.Parse(textBox4.Text);
                not5 = int.Parse(textBox5.Text);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
           float total = not1 + not2 + not3 + not4 + not5;
           
            float deg1 = (not1 / total) * 360;
            float deg2 = (not2 / total) * 360;
            float deg3 = (not3 / total) * 360;
            float deg4 = (not4 / total) * 360;
            float deg5 = (not5 / total) * 360;
Yukarıda ki kod parçaşıyla notu 1,2,3,4,5 olan tüm öğrencileri buluyorum. Elde ettiğim sonucu total değişkenine atıyorum. Sonra 1 alan öğrencilerin sınıfın kaçta kaçını oluşturduğunu bularak 360 ile çarparak dilimdeki payını (açısal) hesaplıyor ve bir değişkene aktarıyorum. Bunu farklı not alan öğrenciler içinde uyguluyorum.
Şimdi pastamızı oluşturmaya başlıyoruz.
Pen p = new Pen(Color.Black, 1);
Graphics g = this.CreateGraphics();
Rectangle rec = new Rectangle(textBox1.Location.X + textBox1.Size.Width + 10, 12, 150, 150);

            Brush b1 = new SolidBrush(Color.Red);
            Brush b2 = new SolidBrush(Color.Blue);
            Brush b3 = new SolidBrush(Color.Yellow);
            Brush b4 = new SolidBrush(Color.Green);
            Brush b5 = new SolidBrush(Color.Orange);
            g.Clear(Form1.DefaultBackColor);
            g.DrawPie(p, rec, 0, deg1);
            g.FillPie(b1, rec, 0, deg1);
            g.DrawPie(p, rec, deg1, deg2);
            g.FillPie(b2, rec, deg1, deg2);
            g.DrawPie(p, rec, deg2 + deg1, deg3);
            g.FillPie(b3, rec, deg2 + deg1, deg3);
            g.DrawPie(p, rec, deg3 + deg2 + deg1, deg4);
            g.FillPie(b4, rec, deg3 + deg2 + deg1, deg4);
            g.DrawPie(p, rec, deg4 + deg3 + deg2 + deg1, deg5);
            g.FillPie(b5, rec, deg4 + deg3 + deg2 + deg1, deg5);
İlk önce pasta dilimlerini birbirinden ayıran çizgimizi  Pen ile rengi siyah ve kalınlığı 1 px olacak şekilde oluşturduk.Graphics ise çizimi oluşturacak metodları içerir. Rectangle, pasta tablomuzun formun hangi koordinatlarda ve hangi büyüklükte olucağını belirler. Bizim örneğimizde x koordinatı “textBox1.Location.X + textBox1.Size.Width + 10” olarak ayarlanmıştır. Böylece grafiğimizin textboxların yanında çıkmasını sağladık. Daha sonra Brush yardımıyla  pasta dilimlerimizi renklendirmede kullanacağımız renkleri Brush tipindeki değişkenlere aktardık.
Graphics’in bize sunduğu metodlardan biri olan g.Clear() metoduyla grafiğimizi işlemlere başlamadan siliyoruz. Burada gördüğümüz ikinci metod olan g.DrawPie()  ile ilk pasta dilimimizi oluşturuyoruz. Bu metodun içerisine oluşturduğumuz pen tipindeki değişkenimiz olan p yi, rectangle tipindeki değişkeninimizi, çizime başlıyacağı başlangıç açısını ve son olarak  oluşturacağımız pasta açısını veriyoruz. g.FillPie() metoduyla ile farklı olarak sadece Brush ile pasta dilimimize renk veriyoruz. Ama dikkat edilmesi gereken şey g.DrawPie ve g.FillPie metodlarında başlangıç açısı “0” ile başlar ve oluşturulan herbir dilim kendinden önceki dilim ve dilimlerin açısının toplamı, başlangıç açısını oluşturur.
Programımızı artık deneyebiliriz.
ex2
ex3
Umarım yararlı olmuştur.

13 Mart 2010 Cumartesi

"Cannot serialize the DataTable. DataTable name is not set." hatası

DataTable tanımlaması yaparken tablo adı belirtmezsek "Cannot serialize the DataTable. DataTable name is not set." hatası ile karşılaşırız.

DataTable dt= new DataTable();
dt.TableName="DataTableIsmi";
ile sorun çözülür

23 Ocak 2010 Cumartesi

C# ve Enumeration (Enum) Kullanımı

Bu makalemde C# sunduğu iki değer türünden biri olan enumeration’ı size anlatacağım. Program yazarken bir çok değişken tanımlar ve bu değişkenlere  sayısal değer  vererek işlemimize başlarız. Ama bu yöntem çokta fazla sezgisel değildir.
Örneğin programımızda haftanın günlerini sunmak istediğimizi düşünelim. Birde günlerle karmaşık işlemler yapacağımız düşünelim. Bunun için  hergüne sayısal değer vermemiz yeterli olacaktır. Pazartesi, Salı, Çarşamba, Perşembe, Cuma, Cumartesi, ve Pazar’a    0,1,2,3,4,5 ve 6 tam sayı değerlerini tanımlamamız yeterli olacak ve bu tamsayılar üzerinden işlemlerimiz gerçekleşecektir. Ama sıfırı (0) kullandıktan ve bir süre sonra kodumuza bakarken sıfırın Pazartesi’ni ifade ettiğini anlamak zor olacaktır. Bu durumda C# güzel bir çözüm sunar ve değerlerin grup sembolik bir adla bildirebileceğimiz enum anahtar sözcüğünü kullanırız.
Bir Enumeration türü bildirmek
Enum DaysOfTheWeek
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
 }
Enumeration’a  erişmek
Yukarıda haftanın günlerini tanımlayan bir enumeration tanımladık. Burdan sadece Cumartesi gününün değerini almak istersek,
DaysOfTheWeek day = DaysOfTheWeek.Saturday;
MessageBox.Show(day.ToString());
Mesaj kutumuzda “6” yazacaktır.
Bu noktada size tüm değer türleri gibi, ? düzenleyici kullanarak enumlandırma değişkeni boş değer alabileceğini hatırlatmak isterim. Daha sonra enumda tanımlanmış bir değer atayabilir veya null değerde set edilebilir.
Haftanın günlerinin hepsini birden almak istersek .GetNames() metodunu kullanırız. Bu metod yardımıyla enum içerisinde kullandığımız değerleri  string formatında bir dizide kullanabiliriz.
Örneğin  string[] days  = Enum.GetNames(typeof(DaysOfTheWeek));  bu kod yardımıyla  artık  days string dizisinde enumdaki elemanlarımız var.
İsterseniz bir tamsayı sabitini bir enum sabitiyle ilişkilendirebilirsiniz.

Örneğin;
enum DaysOfTheWeek
{
Monday,
Tuesday  =  1,
Wednesday = 3,
Thursday,
Friday,
Saturday,
Sunday
 }

Birden çok numaralandırma kalıbına aynı değerde verilebilir.  Örneğin İngiltere’de  Sonbahar için fall yerine Autumn kullanılır. Bunu tanımlayan bir enum kalıbı tanımlıyacak olursak şu şekilde olur.

Enum Season
{
Spring,
Summer,
Fall = Autumn,
Winter
}

string[] days  = Enum.GetNames(typeof(DaysOfTheWeek));
Tekrar başa dönerek DaysOfTheWeek’te tanımladığımız haftanın günlerini combobox ile kullanıya seçtirmek istiyoruz. Bunun içinde haftanın günlerini combobox’ın içine atmamız gerekmekte bunun için şu kodu yazmamız yeterli olacaktır.

// İlk önce Get.Names(); metodunu kullanarak string bir dizinin içerine günleri atıyorum
string[] days  = Enum.GetNames(typeof(DaysOfTheWeek));
// Daha sonra bu dizinin içerisinde dönerek her bir string değeri combobox ın içerisine atıyorum.
       foreach(string day in days)
       {
            daysCombo.Item.Add(day);
       } 
Artık daysCombo adındaki combobox’ta sırasıyla DayOfTheWeek’teki sabitlerimiz eklenmiş durumda.

Birde şunu anlatmanın yararlı olacağını düşünüyorum. DaysOfTheWeek  sabitlerinin içerisinde bir kontrol  yaparak istediğimiz sabitin enum altında tanımlı olan bir sabit olup, olmadığını görmek için IsDefined(); metodunu kullanmamız yeterli olacaktır. Bu metod bool bir sonuç gönderir. Dikkat etmemiz gereken şey ise case sensitive çalışmasıdır.

Örneğin ;
bool success = Enum.IsDefined(typeof(DaysOfTheWeek), “Thursday”);
İf(success)
{
       MessageBox.Show(“Found”);
}
else
{
       MessageBox.Show(“Not Found”);
}


Bu örnek bize Perşembe gününün haftanın günleri enumunda tanımlı olup olmadığını göstericek eğer tanımlı ise IsDefined metodundan tru dönecek ve mesaj kutumuzda bulundu yazacak, yoksa false değer döndürecek ve bulunamadı mesajı ile karşılaşacağız.

Eğer isDefined metodunda şunu yazmış olsaydık,

Enum.IsDefined(typeof(DaysOfTheWeek), “THURSDAY”);
Bu bize false dönecekti. Dikkat etmenizde yarar var.

enum sabitleriyle ToString() metodunun kullanılması.
Burada hemen parametre değerlerini ve işlevlerini açıklamak ve nasıl kullanıcalağını göstermenin yeterli olacağını düşünüyorum.
Parametre Değeri
İşlevi
G
Enum sabiti içerisindeki ilgili değeri genel(General) formatta yazar.
D
Enum sabiti içerisindeki ilgili değerin sayısal(Decimal) karşılığını yazar.
X
Enum sabiti içerisindeki ilgili değerin Hexadecimal (16lı sayı sistemindeki) karşılığını yazar.
 F
FlagsAttribute’ unun kullanılıp kullanılmamasına göre ilgili enum sabiti değerinin string karşılığını yazar.