Günlük kullanım için mini not uygulaması

Desktop üzerinde çalışan gün içerisinde kullanılabilecek mini not uygulaması ile merhaba. Bu örnek de geliştirme tarafında amaç, Xml, timer, datetime vb. nesne ve yapılarını bir arada kullanmak.

xml-timer-datetime

Örnek de yazılan not gün içindeki zamanı belirlenerek kayıt ediliyor. Kayıtlar Xml dosyasında tutulup liste olarak kullanıcıya tab sekmesi altında gösterilebiliyor. Timer kontrolü ile her bir saniye de Xml deki verilerin zamanı kontrol ediliyor. Zamanı gelen not ayrı bir formda kullanıcıya sağ alt köşede açılıyor. Not eğer yapılacak iş ise, işi sonraya ertelemek isterse bunun için ekstra dakika ekletip notu erteleyebiliyor.

Wajanda ismini verdiğim bu not uygulamasını kodları ile birlikte aşağıdan indirebilirsiniz.

Resimdeki gibi bir form ekranı tasarlayıp, forma timer nesnesi ekledikten sonra kaydet botunana aşağıdaki kodları yazalım.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
  private void btnKaydet_Click(object sender, EventArgs e)
        {
            try
            {
                bool varmi = false;
                int enBuyukId;

                XmlDocument doc = new XmlDocument(); // Xml dosyamızı okumak için XmlDocument sınıfından yararlanıyoruz.
                doc.Load("wajanda.xml");
                XmlElement root = doc.DocumentElement;
                XmlNodeList kayitlar = root.SelectNodes("/Baslangic/Notlar"); // 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("wajanda.xml")) // Xml dosyamıza kayıt eklemede hata almamak için dosyanın var olup olmadığını kontrol ediyoruz.
                {

                    XmlElement UserElement = doc.CreateElement("Notlar"); // 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 baslik = doc.CreateElement("baslik");
                    baslik.InnerText = txtBaslik.Text;
                    UserElement.AppendChild(baslik);

                    XmlElement detay = doc.CreateElement("detay");
                    detay.InnerText = txtKonu.Text;
                    UserElement.AppendChild(detay);

                    XmlElement zaman = doc.CreateElement("zaman");
                    zaman.InnerText = (Convert.ToDateTime(cbSaat.Text + ":" + cbDakika.Text + ":" + "00")).ToString();
                    UserElement.AppendChild(zaman);

                    XmlElement durum = doc.CreateElement("durum");
                    durum.InnerText = "1";
                    UserElement.AppendChild(durum);

                    doc.DocumentElement.AppendChild(UserElement);

                    XmlTextWriter xmleekle = new XmlTextWriter("wajanda.xml", null);
                    xmleekle.Formatting = Formatting.Indented;
                    doc.WriteContentTo(xmleekle);
                    xmleekle.Close();

                    txtBaslik.Text = "";
                    txtKonu.Text = "";
                    cbSaat.Text = DateTime.Now.ToLongTimeString().Substring(0, 2);
                    cbDakika.Text = DateTime.Now.ToLongTimeString().Substring(3, 2);

                    lblMesaj.Text = "Kayıt eklendi."; // Kayıt işlemi başarılı bir şekilde bittikten sonra mesaj için label kullanabilirsiniz.
                   
               
                }


            }
            catch (Exception)
            {

                throw;
            }
        }

Form load kısmına Xml dosyasını programın çalıştığı dizine ekliyoruz.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 private void Form1_Load(object sender, EventArgs e)
        {
            var X = Screen.GetWorkingArea(this).Width;
            var Y = Screen.GetWorkingArea(this).Height;
            this.Location = new Point(X - this.Width, Y - this.Height);

            cbSaat.Text = DateTime.Now.ToLongTimeString().Substring(0, 2);
            cbDakika.Text = DateTime.Now.ToLongTimeString().Substring(3, 2);


            try
            {
                if (!File.Exists("wajanda.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("wajanda.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();
                }
                else
                {

                }
            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.ToString());
            }
        }

Form içindeki tab kontrolünde dolaşırken, Xml kayıtlı olan verileri listelemek için listele() metodunu çağıralım.

1
2
3
4
private void tabControl1_Click(object sender, EventArgs e)
        {
            listele();
        }

listele() metodu;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 private void listele()
        {
            listView1.Items.Clear();
            XmlDocument doc = new XmlDocument();

            doc.Load("wajanda.xml");
            XmlElement root = doc.DocumentElement;
            XmlNodeList kayitlar = root.SelectNodes("/Baslangic/Notlar");

            foreach (XmlNode secilen in kayitlar)
            {
                ListViewItem lv = new ListViewItem();
                lv.Text = secilen["id"].InnerText;
                lv.SubItems.Add(secilen["baslik"].InnerText);
                lv.SubItems.Add(secilen["zaman"].InnerText);
                if (secilen["durum"].InnerText == "1")
                {
                    lv.SubItems.Add("Aktif");
                }
                else
                {
                    lv.SubItems.Add("Pasif");
                }

                listView1.Items.Add(lv);
            }
        }

Timer kontrolü her saniyede bir xml deki veriler içinde kayıt zamanını şimdiki zaman ile kontrol ediyor;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private void timer1_Tick(object sender, EventArgs e)
        {
            XmlDocument doc = new XmlDocument();

            doc.Load("wajanda.xml");
            XmlElement root = doc.DocumentElement;
            XmlNodeList kayitlar = root.SelectNodes("/Baslangic/Notlar");

            foreach (XmlNode secilen in kayitlar)
            {

                if ((DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToLongTimeString()) == secilen["zaman"].InnerText && secilen["durum"].InnerText == "1")
                {
                    globalsinifim.id = secilen["id"].InnerText;
                    globalsinifim.zaman = secilen["zaman"].InnerText;
                    this.Show();
                    Form2 frm = new Form2();
                    frm.Show();
                }

            }
        }

Listview de seçileni göstermek için;

1
2
3
4
5
6
7
8
9
string secilen=null;
        private void listView1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (listView1.SelectedItems.Count > 0)
            {
                ListViewItem li = listView1.SelectedItems[0];
                secilen = li.SubItems[0].Text;
            }
        }

Seçileni temizlemek için temizle butonuna yazılacak kodlar;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 private void btnTemizle_Click_1(object sender, EventArgs e)
        {
            try
            {
                XDocument xDoc = XDocument.Load("wajanda.xml");
                XElement deletedElement;
                if (secilen !=null)
                {
                    deletedElement = xDoc.Root.Elements().FirstOrDefault(xe => xe.Element("id").Value == secilen);
                    secilen = null;
                }
                else
                {
                    deletedElement = xDoc.Root.Elements().FirstOrDefault(xe => xe.Element("durum").Value == "0");
                }

                deletedElement.Remove();

                xDoc.Save("wajanda.xml");
                listele();

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }

        }

İkin formda yani notun gösterileceği formda ertele butonuna yazılacak olan kodlar;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 private void btnErtele_Click(object sender, EventArgs e)
        {
            try
            {
            DateTime gelenZaman = Convert.ToDateTime(globalsinifim.zaman);
           
            DateTime ertelenmis = gelenZaman.AddMinutes(Convert.ToInt32(cbDakika.Text));

            XDocument xDoc = XDocument.Load("wajanda.xml");
            XElement currentElement = xDoc.Root.Elements().FirstOrDefault(xe => xe.Element("id").Value == globalsinifim.id);
            currentElement.SetElementValue("zaman", ertelenmis.ToString());
            xDoc.Save("wajanda.xml");

            this.Close();
            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.ToString());
            }

        }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
private void Form2_Load(object sender, EventArgs e)
        {
            try
            {
                var X = Screen.GetWorkingArea(this).Width;
                var Y = Screen.GetWorkingArea(this).Height;
                this.Location = new Point(X - this.Width, Y - this.Height);

                XmlDocument doc = new XmlDocument();

                doc.Load("wajanda.xml");
                XmlElement root = doc.DocumentElement;
                XmlNodeList kayitlar = root.SelectNodes("/Baslangic/Notlar");


                foreach (XmlNode secilen in kayitlar)
                {
                    if (secilen["id"].InnerText == globalsinifim.id)
                    {

                        lblBaslik.Text = secilen["baslik"].InnerText;
                        txtKonu.Text = secilen["detay"].InnerText;
                    }
                }
            }
            catch (Exception)
            {

                throw;
            }
        }

Kapat butonu ile okunan notu xml dosyasından silmek için;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 private void btnKapat_Click(object sender, EventArgs e)
        {
            try
            {
                XDocument xDoc = XDocument.Load("wajanda.xml");
                XElement currentElement = xDoc.Root.Elements().FirstOrDefault(xe => xe.Element("id").Value == globalsinifim.id);
                currentElement.SetElementValue("durum", "0");
                xDoc.Save("wajanda.xml");

                this.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

Windows form da pdf dosya yazdırmak

Masaüstü windows form projelerinde raporlama vb. durumlarda form üzerinden çıktı dosya almak istemişizdir. Bu örneğimizde basit bir windows from dan PDF(Portable Document Format) dosyasına veri aktarımını yani yazdırma işlemini gerçekleştireceğiz.

Pdf bildiğiniz gibi her platformda çalışan ve ücretsiz görüntülenebildiği için excel vb. tarzı dosyalara göre daha fazla rağbet görmekte. Konuyu fazla uzatmadan basit bir form ekranı hazırlayıp windows formdan pdf e yazdırma işlemini yapalım.

csharp-to-pdf

Resimdeki gibi bir form ekranı oluşturun. Buradaki amaç textboxa girilen değerler doğrultusunda önceden belirlediğiniz dizine pdf dosyasını oluşturmak. Bir adet multiline değeri true olan textbox ve buton forma ekledikten sonra aktarım için gerekli olan itextsharp.dll dosyasını projeye referans olarak ekleyin.(Dosyayı indireceğiniz proje içinde bulabilirsiniz)

Formu ve kütüphaneyi projeye ekledikten sonra buton click olayına aşağıdaki kodları yazabiliriz;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;

// Eklemeyi unutmayın !

 private void btnYazdir_Click(object sender, EventArgs e)
        {
            try
            {

                iTextSharp.text.Document pdfDosyam = new iTextSharp.text.Document();
                PdfWriter.GetInstance(pdfDosyam, new FileStream("C:\\digitaldunyam\\coder.pdf", FileMode.Create));

                pdfDosyam.AddCreator("Oluşturucu adını buaraya girebilirsiniz");

                if (pdfDosyam.IsOpen() == false)
                {

                    pdfDosyam.Open();
                }
                pdfDosyam.Add(new Paragraph(txtIcerik.Text));

                pdfDosyam.Close();
                MessageBox.Show("Pdf dosyası oluşturuldu.");

            }
            catch (Exception)
            {

                MessageBox.Show("Hata ! Oluşturulmadı...");
            }
        }

Not: Pdf’i oluşturmak için  C dizine daha önceden digitaldunyam isimli klasör eklemeniz gerekir.

Windows formdan smtp ile mail gönderme

Windows form uygulamasında internet aracılığı ile bir yerlere veya kullanıcıya mail göndermek istemişizdir. Bu ihtiyaca karşılamak için mini bir smtp ile mail gönderme uygulaması hazırladım.

windowsformsmtpgonderimi

Resimdeki gibi bir form ekranı hazırlayıp kod tarafına buton clik olayından geçebiliriz. Geçemeden önce örnek uygulama google gmail smtp ayarları ile yapıldığını hatırlatayım. Kendi gmail adresiniz ve şifrenizi girerek smtp mail gönderim testini yapabilirsiniz.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private void btnGonder_Click(object sender, EventArgs e)
        {
            //using System.Net.Mail; 
            try
            {
                MailMessage mail = new MailMessage();
                SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");
                mail.From = new MailAddress("postaadresin@gmail.com"); // gmail adresiniz

                mail.To.Add(txtGonderilecekAdres.Text);
                mail.Subject = txtBaslik.Text;
                mail.Body = txtKonu.Text;

                SmtpServer.Port = 587; // gmail port numarası 587 olduğu için bu port numarasını kullandık
                SmtpServer.Credentials = new System.Net.NetworkCredential("postaadresin@gmail.com", "sifresi"); // gmail adresiniz ve şifresini buraya girin
                SmtpServer.EnableSsl = true;

                SmtpServer.Send(mail);
                MessageBox.Show("Mail gönderildi");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

Gerekli açıklamalar kodlar içinde mevcut. SmtpClient, SmtpServer sınıflarını kullanarak yapılmış örnek uygulama.

Windows formda geri sayım sayacı

Windows formda timer kullanımına örnek olarak basit bir geri sayım sayacı örneği ile merhaba. Basit bir geri sayım sayacı bazen kafaları karıştırmıştır. Bu gibi durumlar için basit bir örnek ile sayım aracını göstermek istedim.

geri-sayim-araci

Resimdeki gibi biraz afilli bir forma timer, textbox, buton ve label kontrolleri ekleyerek başlayabiliriz. Zamanı kısıtlı arkadaşlar örneği aşağıdaki bağlantıdan indirebilir…

Form tasarımından sonra kod tarafına geçebiliriz. İlk olarak sayacı başlatacak olan buton kontrolü clik olayına aşağıdaki kodları yazıyoruz. Burada yapılan global olarak tanımlanan sayı değişkenine kullanıcıdan textbox aracılığı ile alınan sayıyı atadıktan sonra timer kontrolünü bir saniyede bir çalışacak şekilde aktif ediyoruz.

1
2
3
4
5
6
7
 int sayi;
        private void btnBasla_Click(object sender, EventArgs e)
        {
            sayi = Convert.ToInt32(textBox1.Text);
            timer1.Enabled = true; // Timer aktif ediyoruz
            timer1.Interval = 1000; // Saniyede bir çalışması için interval değerini 1000 yapıyoruz
        }

Aktif edilen timer içindeki kodu her bir saniyede bir çalıştıracağı için gelen sayıyı birer azaltıp label kontrolü yardımı ile azalan sayıyı gösteriyoruz. Ve sıfır olunca timer kontrolünü durduruyoruz.

1
2
3
4
5
6
7
8
9
 private void timer1_Tick(object sender, EventArgs e)
        {
            sayi--; //timer her saniyede sayıyı 1 azaltacak
            lblSayi.Text = sayi.ToString();
            if (sayi == 0)
            {
                timer1.Enabled = false;
            }
        }

Database bağlı formda arama yapmak

Veritabanına bağlı windows form uygulamasında form içinde database deki verileri arama yaparak listview veya başka bir kontrolde göstermek için yapmamız gereken standart olarak yaptığımız ado.net olayında sqlcommand satırındaki sorguya ek parametre ekleyerek sorguyu gerçekleştirmek.

veritabani-form-arama

Form ekranına resimdeki gibi textbox buton ve gelecek olan verileri gösterebilmek için listview kontrolü sürükleyip yerleştirin. Örnek içinde iki şekilde arama yapabilirsiniz. Biri Google daki gibi arama yaparken harfleri girdikçe çıkacak olan sonuçları anında gösteren(bu büyük veri için aramanızda performans kaybı yaşanacaktır), diğeri ise aratılacak olan kelimeyi girdikten sonra buton ile arama işlemini yaptırmak.

Buton ile aratma yapmak için buton clik olayına yazılacak kod;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SqlConnection sql = new SqlConnection("server=.; database=coder; trusted_connection=true;");

        private void btnAra_Click(object sender, EventArgs e)
        {
            lvListe.Items.Clear();
            SqlCommand doldur = new SqlCommand("select * from tblDeneme where ad like '%" + txtKelime.Text + "%'", sql);
            sql.Open();
            SqlDataReader rdr = doldur.ExecuteReader();
            while (rdr.Read())
            {
                ListViewItem li = new ListViewItem();
                li.Text = rdr["ad"].ToString();
                li.SubItems.Add(rdr["soyad"].ToString());
                lvListe.Items.Add(li);
            }

            sql.Close();
        }

Textbox’un TextChanged olayına yazılacak kod;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 private void txtKelime_TextChanged(object sender, EventArgs e)
        {
            lvListe.Items.Clear();
            SqlCommand doldur = new SqlCommand("select * from tblDeneme where ad like '%" + txtKelime.Text + "%'", sql);
            sql.Open();
            SqlDataReader rdr = doldur.ExecuteReader();
            while (rdr.Read())
            {
                ListViewItem li = new ListViewItem();
                li.Text = rdr["ad"].ToString();
                li.SubItems.Add(rdr["soyad"].ToString());
                lvListe.Items.Add(li);
            }

            sql.Close();
        }

Windows form sql server bağlantısı

C# veya VB.net ile yapılan Windows form uygulamasında oluşturduğunuz veya oluşturulan sql veritabanına(mssql) bağlantı kurup verileri işleyebilmek için ADO.NET teknolojisinden faydalanmaktadır. Ado.net ile windows uygulamasını veya web(asp.net) uygulamasını birbirine bağlayıp veri transferi ve okuması yaptırabiliyorsunuz.

Peki bu bağlantı nasıl yapılıyor soracak olursanız; En basitinden local(kendi bilgisayarınızda) yaptığınız windows form uygulamasını sql server daki oluşturduğunuz veri tabanı ile bağlantı kurabilmek için SqlConnection den faydalanılır.

Kendi bilgisayarımda coder isimli veritabanıma bağlantı için form load veya başka bir yerde yazdığım kod satırı;

1
SqlConnection sql = new SqlConnection("server=.; database=coder; trusted_connection=true;");

Bu şekilde bağlantı yolunu tanımlıyoruz. Bundan sonra yapacağımız işlemler için bu bağlantıdaki örnek uygulamaları inceleyebilirsiniz;

http://coder.digitaldunyam.net/ado-net/