C# C# Windows Form Örnekleri Programlama

C# DateTimePicker Kullanarak DataGridView Üzerinde Veri Filtreleme

Bu yazımızda C# ile DatagridView içine veritabanından veri çekerek, DatetimePicker kontrolleri kullanarak iki tarih arasındaki kayıtların filtrelenmesi ve DataGridview üzerinde görüntülenmesini sağlayan basit bir örnek gerçekleştireceğiz.

Örneğimizi Sql Server Veritabanı bağlantısı kullanarak “otobus” isimli veritabanındaki “Musteriler” isimli tablodaki verileri çekerek gerçekleştireceğiz. Form yüklendiğinde tüm verilerin DatagridView üzerinde görüntülenmesini sağlayacağız. Daha sonra Formumuza eklemiş olduğumuz iki adet DatetimePicker ile doğum tarihine göre başlangıç ve bitiş tarihi ayarlayarak bu iki tarih arasındaki verilerin DataView kullanarak filtrelenmesini ve DatagridView üzerinde görüntülenmesini sağlayacağız.

Daha önceki yazılarımızda C# SQL bağlantısı ile ilgili örnekler oluşturduğumuzu hatırlatarak örneğimize geçelim.

Form tasarımını aşağıdaki gibi oluşturalım.

datetimepicker_filtreleme_3

Formumuzda görüldüğü gibi 1 adet DatagridView, 2 adet DateTimePicker ve 1 adet Button bulunmakta.

Şimdi kodlarımıza geçelim. Öncelikle;

ekliyoruz. Daha sonra;

nesnelerimizi public olarak oluşturuyoruz.

Verilerimizin Form ilk açıldığında DatagridView üzerinde görüntülenmesini sağlamak için Form_Load olayına aşağıdaki kodları yazıyoruz.

datetimepicker_filtreleme_2

Son olarak Filtrele butonu için aşağıdaki kodları oluşturuyoruz.

Kodlarımızı tamamlamış olduk. Örneğimize ait C# kodlarının tamamlanmış hali aşağıdaki şekilde olacaktır.

Şimdi programımızı çalıştırarak aşağıdaki gibi DatetimePicker kontrollerinden 2 tarih ayarlayarak bu 2 tarih arasındaki verileri DatagridView üzerinde filtreleyelim.

datetimepicker_filtreleme_1

Görüleceği gibi başlangıç ve bitiş tarihine göre DatagridView üzerinde veri filtreleme işlemini gerçekleştirmiş olduk.

36 Yorum

  • Hocam merhabalar,
    Öncelikle bu faydalı paylaşım için çok teşekkür ediyorum.
    Ancak ben kodunuzu kullanarak filtreleme yaptığımda sadece günü baz alıyor bende, yani şöyle:
    mesela 28.04.2021 de verim var birde 17 ve 18.05.2021 de verilerim var. İlk tarih olarak 01.05.2021 ve ikinci olarak 20.05.2021 seçtiğimde sadece 17 ve 18 mayıstaki veriler geliyor, buraya kadar her şey güzel. Ancak 01.04.2021 ile 30.04.2021 seçtiğimde hem 28.04.2021 hem de 17 ve 18.05.2021 de bulunan veriler geliyor sebebi ne olabilir acaba yardımcı olabilir misiniz?

    • Merhabalar,
      Uzun uğraşlar sonucu bahsettiğim durumun database de bulunan verilerin text türünde olmasından kaynaklandığını buldum. Ancak sonum şu ki gelen databaselerdeki tarih verisi maalesef text olmak zorunda ve benim bunu doğru şekilde tarihe göre süzdürebilmem gerek. Yok mu yardımcı olabilecek birileri?

        • Cevap için teşekkürler, belirtmeyi unutmuşum ancak database ms access türünde.
          Verdiğiniz linki inceledim belki uyarlayabilirim diye ancak pek mümkün gelmedi.
          Aşağıda ki kod database de tarih kısmı date formatında olduğunda sorunsuz çalışıyor ancak string olduğunda sıkıntılı oluyor. Kodu birde siz inceleyebilir misiniz? Belki direk yolu biliyorsunuzdur.

          OleDbCommand sor = new OleDbCommand(“select *from ” + TabloAdi + ” Where Tarih Between @Tarih1 and @Tarih2″, Baglan);
          sor.Parameters.AddWithValue(“@Tarih1”, dateTimePicker1.Text);
          sor.Parameters.AddWithValue(“@Tarih2”, dateTimePicker2.Text);
          OleDbDataAdapter deneme = new OleDbDataAdapter(sor);
          DataSet ds = new DataSet();
          deneme.Fill(ds);
          dataGridView1.DataSource = ds.Tables[0];

          burada Where ifadesinden sonra gelen Tarih tablonun adıdır ve veri tipi text olduğundan sıkıntı çıkmaktadır.

          • Merhabalar,
            Sorunumu kendi uğraşlarım ile çözdüm ve belki aynı sorunu yaşayan birilerine de yardımcı olur diye paylaşmak istedim.
            Aşağıda +TabloAdi benim tablo adım yapılacak seçimlere göre değiştiğinden string türünde bir değişkendir. Tablo adı sabit olan arkadaşlar çift tırnaklar arasına fromdan sonra direk tablo isimlerini yazabilirler.

            sorgu = new OleDbCommand(“select * from ” + TabloAdi, Baglan);
            kayitokuma = sorgu.ExecuteReader();
            DataTable nw = new DataTable();
            nw.Columns.Add(“Tarih”);
            nw.Columns.Add(“BasilanAdet”);
            while (kayitokuma.Read())
            {
            if ( (Convert.ToDateTime(kayitokuma[“Tarih”]) >=
            Convert.ToDateTime(dateTimePicker1.Text)) &&
            (Convert.ToDateTime(kayitokuma[“Tarih”]) <=
            Convert.ToDateTime(dateTimePicker2.Text)) )
            {
            DataRow dr = nw.NewRow();
            dr["Tarih"] = kayitokuma["Tarih"].ToString();
            dr["BasilanAdet"] = kayitokuma["BasilanAdet"].ToString();
            nw.Rows.Add(dr);
            dataGridView1.DataSource = nw;
            }
            }

  • Hocam Kolay Gelsin Ben bu kodu çalıştırdım fakat veritabanından çektiğimi filtreliyor ama şöyle bir sorun var ki kayıtlarda Başlangıç Tarihi :08.01.2017 Bitiş Tarihi: 10.01.2017 Dediğimde İkisinin arasındakileri ve Diğer ayın YANİ Şubatın 08.02.2017 ‘sinide Filtrelemeye alıyor ben diğer ayı almasını istemiyorum AYNI ŞEKİLDE MART’A DA 08.03.2017 KAYIT VAR Onuda alıyor bu filtreleme ayı kontrol etmiyor herhalde yardımcı olabilirmisiniz şimdiden çok teşekkür ederim.

  • hocam verileri filtreleme yaptım ancak veri tabanındaki verileri geri nasıl eski haline getirebilirim.yani temizle diye bir buton atadım. buna tıklanınca tüm veri tabanı gelsin istiyorum.

    • Sql yazan bolumlere oledb yazarak uyarlayabilirsiniz. Or: sqlconnection yerine oledbconnection gibi.

      • Teşekkürler ..

        DataView dv = tablo.DefaultView; Komutunda tablo da hata aldım sebebi ne olabilir acaba .

        • dogum_t sutunu bulunamadı, hatası veriryor sutun bulunduğu halde.

          dv.RowFilter = string.Format(“dogum_t > ‘{0}’ AND dogum_t <= '{1}'", dateTimePicker1.Value, dateTimePicker2.Value);

  • Merhaba bu filtrelemeyi çok fazla sayıda veri oldugunda aşırı bir yavaşlama oluyor hatta kilitlenme oluyor .kendi halimde barkod programi yazıyorum ve marketde kullaniyorum .günlük satışlar ve aylık satışlarda kullanıldığında sıkıntılı.kısaca büyük veri potansiyeli olan işlerde kullanmayin arkadaşlar.http://www.yazilimkodlama.com/programlama/c-verilen-iki-tarih-arasindaki-kayitlari-datagridview-de-goruntuleme/ ahmet bey’in sql den sorgulamasi ile çektiği şekilde kullanmak daha hızlı ve sıkıntısız çalışıyor.ben niçin deniyorum diye sorarsanız datagridviewi daha iyi kavramaya ve programima farklı şeyler katmaya çalısıyorum.12 adet formum raporlama üstüne ve hepsinde sql sorgusu kullandim.farklı şeyler denedim ama sql sorgusu yapıp sonucu aktarmak en hızlı çözüm

  • mrb ben bu işte acemıyım gunlerce uğraşıp kendı ışıme uygun bir proğram yaptım yanlız ıkı tarıh arası filtreleme yapamadım yukardakı örneği kendıme uyarlayamaya çaliştım ama yapamadım sebebı ıse de hocamın ornegı sql ben ıse acsess verı tabanı kullandım bunu nasıl uyarlayabılırım acaba tşk ıyı akş

    • Bağlantınızı nasıl oluışturduğunuzu görmem gerekiyor. DataTable kullanarak yaptıysanız yukarıdaki şekilde rahatlıkla uygulanabilir. Çok acil değilse Facebook sayfamızdan projenizi sıkıştırıp yollarsanız incelemeye çalışırım.

    • yukardaki System.Data.SqlClient; yerine using System.Data.OleDb;

      —————————————————————————————————————
      SqlConnection baglanti; OleDbConnection baglanti; SqlDataAdapter da; yerine OleDbDataAdapter da;

      ————————————————————————————————————–
      baglanti = new SqlConnection(“server=.; Initial Catalog=otobus;Integrated Securit

      yerine

      baglanti = new OleDbConnection(“Provider=Microsoft.ACE.OLEDB.12.0; Data Source=veritabani1.accdb”);
      ————————————————————————————————————–
      da = new SqlDataAdapter(“Select *From Musteriler”, baglanti);

      yerine

      da = new OleDbDataAdapter(“Select *From Musteriler”, baglanti);

      Musteriler yerine de accessde tablonun ismi ne yaptıysan onu yaz ve türkçe karakter kullanma
      ———————————————————————————————————–
      bu şekilde değiştirmen gerekiyor

  • O zaman şu şekilde yapılabilir. Atıyorum A : 200,B : 320, C :50, D:40 olarak tutsun. Tümünün toplamı 610 1-610 arası rasgele sayı tutturup Sayı 0-200(A) arasındaysa A kişisi,200-520 arasındaysa B kişisi.. şeklinde yapılabilir. Rasgele sayı tuma ve if-else if yapısıyla çözülebilir. İlgilenip buraya atmaya çalışırım.

    • Hocam öyle olmaz ya 320 olanın şansı daha çok olmalı orda 120 oluyo siz örnek proje yaparsanız bi gün bakarım yinede teşekkürler

        • Çok teşekkürler tam istediğim gibi olmuş ama mantıkta if ilerledikce a + b + c şeklinde büyümesini anlamadım açıklayabilir misiniz?

          • A=5 B=10 C=15 D=20 olsun.

            Toplam: 50 eder. Rasgele sayımız 1-50 arası olacak.
            Eğer 1 den 5 e kadar tutarsa A (0-a arası) 50 de 5 ihtimal
            5-15 arası tutarsa B (a – (a+b) arası) 50 de 10 ihtimal
            15-30 arası tutarsa C ((a+b) -(a+b+c) arası) 50 de 15 ihtimal
            30-50 arası tutarsa D olacak bu değerleri de değişkenden almamız gerekiyor. 50 de 20 ihtimal.

          • Çok teşekkürler aynı şekilde projeme devam ediyorum bu arada size soru sorabilceğimiz bi platform yapabilir misiniz yada epostanıza soru yazmak gibi c# hakkında

          • Facebook sayfamizi beğenerek sayfamizda bulunan mesaj butonunu kullanabilirsiniz.

  • Kişi sayılarının belli bir sınırı var mı? Yani 1′ den kaça kadar olacak sayıları. Şu an aklıma gelen bir dizi ya da list oluşturup yukarıdaki varsayıma göre içine 5 tane A,4 tane B … şeklinde ekleme (tabi bu kısmıda rasgele olacak) yapıp butona basıldığında dizinin eleman sayısı kadar rasgele bir sayı tutularak o sayının karşılığı olan dizi elemanı hangisiyse onun gösterilmesi şeklinde. Sonuçta kişilerin gösterilme ihtimali dediğiniz gibi olacaktır.

  • Hocam bu konuyla ilgisiz bi sorum var c# hakkında cevaplayabilirmisiniz?:

    örneğin 4 kişi düşünün her kişinin bi sayısı var örneğin A=5 B=4 C=3 D=2 gibi her program başlatıldığında bu sayılar rastgele olarak değişiyor buraya kadar yaptım fakat istediğim şey butona bastığımda bunlardan birini seçsin ama hangisinin sayısı daha büyükse onun olasılığı daha büyük olsun mesela üstteki örnekte toplam 14, A ise 5 o zaman A’nın çıkma olasılığı 5/14 bunun için neyi araştırmalıyım? derslerinizi takip ediyorum ama bunun için bi dersinizi bulamadım

Yorum yap