csharp etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
csharp etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

11 Ağustos 2010 Çarşamba

dBase (.dbf) Dosya Okuma

Selam,
dBase yani dbf dosyalarını okumanız için ilk önce sınıfınıza gerekli olan using ifadesi olan System.Data.Odbc eklemiz gerekmektedir.

Sonra aşağıdaki metodu kullanmanız yeterli olacaktır.

private void ReadData()
        {
            OdbcConnection oConn = new OdbcConnection();
            oConn.ConnectionString = @"Driver={Microsoft dBase Driver (*.dbf)};SourceType=DBF;SourceDB= C:\ ;Exclusive=No; Collate=Machine;NULL=NO;DELETED=NO;BACKGROUNDFETCH=NO;";
            oConn.Open();
            System.Data.Odbc.OdbcCommand oCmd = oConn.CreateCommand();
            oCmd.CommandText = @"SELECT * FROM C:\item.dbf WHERE ITEM = 10001";
            DataTable dt = new DataTable();
            dt.Load(oCmd.ExecuteReader());
            oConn.Close();

            bdfDataGridView.DataSource = dt;
        }

Kolay Gelsin.

C Sharp ile Excel Dosyasına Yazmak

Herkese Selam,
Bir süre önce excell dosyası oluşturan ve bu dosyanın içerisine belirtilen değerleri yazan bir class yazmıştım. Bu class’ı sizinle paylaşmak istedim. Belki bir gün bir yerde ihtiyacınız olabilir.
public class ExcelService
    {
        private Microsoft.Office.Interop.Excel.Application app;
        private Microsoft.Office.Interop.Excel.Workbook workbook;
        private Microsoft.Office.Interop.Excel.Worksheet worksheet;
        private Microsoft.Office.Interop.Excel.Range range;
        public void CreateExcelDocument()
        {
            CultureInfo oldCulture = Thread.CurrentThread.CurrentCulture;
            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
            app = new Microsoft.Office.Interop.Excel.Application();
            app.Visible = false;
            Thread.CurrentThread.CurrentCulture = oldCulture;
        }
        public void Save(string path)
        {
                CultureInfo oldCulture = Thread.CurrentThread.CurrentCulture;
                Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
                workbook.SaveAs(path, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
                Thread.CurrentThread.CurrentCulture = oldCulture;
        }
        public void CreateWorkSheet(string workSheetName)
        {
            CultureInfo oldCulture = Thread.CurrentThread.CurrentCulture;
            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
            Microsoft.Office.Interop.Excel.Worksheet retVal;
            if (workbook == null)
            {
                workbook = app.Workbooks.Add(true);
                retVal = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets.Add(Type.Missing, Type.Missing, Type.Missing, Type.Missing);
                retVal.Name = workSheetName;
                Microsoft.Office.Interop.Excel.Worksheet currentWorkSheet;
                for (int i = 1; i <= workbook.Worksheets.Count; i++)
                {
                    currentWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[i];
                    if (currentWorkSheet.Name.Equals("Sheet1"))
                    {
                        currentWorkSheet.Delete();
                    }
                }
            }
            else
            {
                retVal = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets.Add(Type.Missing,
                                                                                           Type.Missing,
                                                                                           Type.Missing,
                                                                                           Type.Missing);
                retVal.Name = workSheetName;
            }
            Thread.CurrentThread.CurrentCulture = oldCulture;
        }
        public void WriteData(int row, int col, string data, string stringFormat, string workSheetName)
        {
            CultureInfo oldCulture = Thread.CurrentThread.CurrentCulture;
            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
            for (int i = 1; i <= workbook.Worksheets.Count; i++)
            {
                Microsoft.Office.Interop.Excel.Worksheet retVal =
                    (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[i];
                if (retVal.Name.Equals(workSheetName))
                {
                    if (!(string.IsNullOrEmpty(stringFormat)))
                    {
                        range = retVal.get_Range(retVal.Cells[row, col], retVal.Cells[row, col]);
                        range.Value2 =data.Replace(",", ".");
                        range.NumberFormat = stringFormat;
                    }
                    else
                    {
                        range = retVal.get_Range(retVal.Cells[row, col], retVal.Cells[row, col]);
                        range.Value2 = data;
                    }
                }
            }
            Thread.CurrentThread.CurrentCulture = oldCulture;
        }
        public void MergeColumns(int row, int col, int row2, int col2, int mergeColumns, string workSheetName)
        {
            CultureInfo oldCulture = Thread.CurrentThread.CurrentCulture;
            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
            for (int i = 1; i <= workbook.Worksheets.Count; i++)
            {
                Microsoft.Office.Interop.Excel.Worksheet retVal =
                    (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[i];
                if (retVal.Name.Equals(workSheetName))
                {
                    range = retVal.get_Range(retVal.Cells[row, col], retVal.Cells[row2, col2]);
                    range.Merge(mergeColumns);
                }
            }
            Thread.CurrentThread.CurrentCulture = oldCulture;
        }
        public void EditCell(int row, int col, string color, bool isBold, int size, string workSheetName)
        {
            CultureInfo oldCulture = Thread.CurrentThread.CurrentCulture;
            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
            for (int i = 1; i <= workbook.Worksheets.Count; i++)
            {
                Microsoft.Office.Interop.Excel.Worksheet retVal =
                    (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[i];
                if (retVal.Name.Equals(workSheetName))
                {
                    range = retVal.get_Range(retVal.Cells[row, col], retVal.Cells[row, col]);
                    switch (color)
                    {
                        case "ORANGE":
                            range.Interior.Color =
                    System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Orange);
                            break;
                        case "KHAKI":
                            range.Interior.Color =
                            System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Khaki);
                            break;
                        case "BURLYWOOD":
                            range.Interior.Color =
                    System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.BurlyWood);
                            break;
                        case "SKYBLUE":
                            range.Interior.Color =
                    System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.SkyBlue);
                            break;
                        case "GAINSBORO":
                            range.Interior.Color =
                    System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Gainsboro);
                            break;
                        case "WHITESMOKE":
                            range.Interior.Color =
                    System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.WhiteSmoke);
                            break;
                        default:
                            //  workSheet_range.Interior.Color = System.Drawing.Color..ToArgb();
                            break;
                    }
                    range.Font.Bold = isBold;
                    range.ColumnWidth = size;
                }
            }
            Thread.CurrentThread.CurrentCulture = oldCulture;
        }
        internal void Dispose()
        {
            if (app != null)
            {
                app.Quit();
            }
            app = null;
            workbook = null;
            worksheet = null;
            range = null;
        }
    }

Kullanmadan önce projemize interop excell referansını vermeniz gerekir.


Bu işlemi yaptıktan sonra gerekli using ifadelerini vermemiz gerekir. Bunlar;
using System.Globalization;
using System.Threading;
Bu işlemlerden sonra sınıfımız kullanmaya hazırdır. Kullanımı için basit bir örnek verecek olursam.
            excellApp.CreateExcelDocument();
            excellApp.CreateWorkSheet("Deneme Work Sheet");
            excellApp.WriteData(1, 1, "Emrah", "", "Deneme Work Sheet");
            excellApp.MergeColumns(1, 1, 1, 2, 2, "Deneme Work Sheet");
            excellApp.EditCell(1, 1, "ORANGE", true, 7, "Deneme Work Sheet");
            excellApp.Save(@"C:\deneme");
Bu kod  yardımıyla C: \ dizini altında deneme excell dosyası oluşur. Sonucunda deneme dosyasının içerisinde şunu görürsünüz.




Bu kadar basit umarım işinize yarar.
Kolay gelsin.

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

11 Aralık 2009 Cuma

neden out neden ref

C# 'ta 2 anahtar kelime olan out ve ref 'ten bahsedeceğim. Bu 2 anahtar kelime değer türlerini ve veri türü referans yollarını fonksiyonlarımıza taşımamıza yarıyor.

Neden Ref?
Değer türü derken int, bool gb. kavramlardan bahsettiğimi anlamışsınızdır. Bu veri türleri kullanılırken bu değişkenlerin yeni bir kopyası oluşturulur ve bu kopyalar üzerinden işlem gerçekleştirilir. Yani fonksiyonlarda kopya değişkenlerimizi kullanıyoruz. Ancak bazı durumlarda kopya kullanmak yerine değer türünü direk kullanmak isteriz. Bunu C# bu anahtar kelimelerle gerçekleştiriyoruz.
Gelelim bu 2 anahtar kelimeyi nasıl kullanıyoruz.

Şimdi recover bir fonksiyon tanımladık bu geri dönüş değeri olmayan fonksiyon. Bu fonksiyonda 2 int türünde değişkenler oluşturduk. Değişkenlerimize değer atadık. Değişenkenlerimizi ref ifadesiyle DoSomething fonksiyonuna gönderdik. Bu işlemi gerçekleştirerek Değişkenimizin Kopyasını değil kendisini direk olarak DoSomething fonksiyonuna gönderdik. Amacımız örnek oldugu için bu değişkenlerimizin değerlerini birbiriyle değiştirdim ve aldıkları değeri geri gönderip, recover fonksiyonunda yazdırdık. Dikkat etmemiz gereken önemli bir nokta ise ref kullanacağımız değişkene atanmış değer olması gerekir. Yoksa aynen "Use of unassigned local variable" hata mesajını alırız. Eğer recover fonksiyonunda (ref x, ref y) yerine (x, y) yazmış olursak Argument '1': cannot convert from 'int' to 'ref int', hatasını alırdık.
Neden Out?
Aslında out'un mantığı ile ref ' in mantığı tamamen aynıdır. Tek fark ve en önemlisi bu out ifadesinde değişkenimize değer atamamıza gerek yoktur.


Bu örnekte değer atanmamış değişkenimize out ifadesiyle değişken atadık. Basit olsun anlaşılır olsun. :)