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.
Formumuzda görüldüğü gibi 1 adet DatagridView, 2 adet DateTimePicker ve 1 adet Button bulunmakta.
Şimdi kodlarımıza geçelim. Öncelikle;
1 2 3 | using System.Data.SqlClient; |
ekliyoruz. Daha sonra;
1 2 3 4 5 | SqlConnection baglanti; SqlDataAdapter da; DataTable tablo; |
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.
1 2 3 4 5 6 7 8 9 10 11 12 | private void Form1_Load(object sender, EventArgs e) { baglanti = new SqlConnection("server=.; Initial Catalog=otobus;Integrated Security=SSPI"); baglanti.Open(); da = new SqlDataAdapter("Select *From Musteriler", baglanti); tablo = new DataTable(); da.Fill(tablo); dataGridView1.DataSource = tablo; baglanti.Close(); } |
Son olarak Filtrele butonu için aşağıdaki kodları oluşturuyoruz.
1 2 3 4 5 6 7 8 | private void button1_Click(object sender, EventArgs e) { DataView dv = tablo.DefaultView; dv.RowFilter = string.Format("dtarih > '{0}' AND dtarih <= '{1}'", dateTimePicker1.Value, dateTimePicker2.Value); dataGridView1.DataSource = dv; } |
Kodlarımızı tamamlamış olduk. Örneğimize ait C# kodlarının tamamlanmış hali aşağıdaki şekilde olacaktır.
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 | using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Data.SqlClient; namespace tarih_filtreleme { public partial class Form1 : Form { public Form1() { InitializeComponent(); } SqlConnection baglanti; SqlDataAdapter da; DataTable tablo; private void Form1_Load(object sender, EventArgs e) { baglanti = new SqlConnection("server=.; Initial Catalog=otobus;Integrated Security=SSPI"); baglanti.Open(); da = new SqlDataAdapter("Select *From Musteriler", baglanti); tablo = new DataTable(); da.Fill(tablo); dataGridView1.DataSource = tablo; baglanti.Close(); } private void button1_Click(object sender, EventArgs e) { DataView dv = tablo.DefaultView; dv.RowFilter = string.Format("dtarih > '{0}' AND dtarih <= '{1}'", dateTimePicker1.Value, dateTimePicker2.Value); dataGridView1.DataSource = dv; } } } |
Ş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.
Görüleceği gibi başlangıç ve bitiş tarihine göre DatagridView üzerinde veri filtreleme işlemini gerçekleştirmiş olduk.
Hocam merhaba bu uygulamayı oracle da nasıl yapabiliriz acaba?
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?
Sql deki string türündeki datayı date time türüne çevirebilirsin. Aşağıdaki bağlantıya bakar mısın işine yarayabilir.
https://www.tasarimkodlama.com/veritabani/sql-server/sql-tarih-convert-islemleri-sql-tarih-sorgulari/
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 Acces veritabanı kullanıyorum bu arada.
Filtreleme islemi icin herhangi bir sql sorgusu calismiyor bu programda. Direkt olarak datagrid uzerinden filtreleme yapilmakta. Tekrar kontrol ederim. Sizde birkez daha kodlari kontrol edin.
Sql Sorgusu ile direk veritabanından çekme ihtimali varmı peki datagrid üzerinden çekmek yerine veya öyle yapmış olduğunuz bir örnek varmı acaba.
Ben daha yeni başladım pek bilmiyorum o yüzden dolayı şimdiden teşekkür ederim.
Aşağıdaki konuya bakabilirsiniz. Linkini verdiğim konuda sql sorgusu kullanılarak filtreleme işlemi yapılmakta.
http://www.yazilimkodlama.com/programlama/c-verilen-iki-tarih-arasindaki-kayitlari-datagridview-de-goruntuleme/
Hocam çok teşekkür ederim bu projeyi link olarak atabilirmisiniz indirip kontrol ederek yapmak isterim. Çok Teşekkürler..
İlgili konunun altına indirme linkini ekledim. ayrıca son 1 ay ve son 1 yıl için filtreleme işlemi içinde kodlar mevcut. İndirip incelersiniz.
Çok teşekkür ederim iyi çalışmalar dilerim.
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.
Form_Load bolumundeki kodlari button icin kullanabilirsiniz.
Bu Uygulamayı Access üzerinden yaptığım projeye nasıl uyarlayabilirim acaba ?
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
Zaten daha cok olacak.
Merhaba. Projeyi indirip inceleyebilirsiniz.
https://yadi.sk/d/gtUPnEYBwneLz
Ç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 kişi sayısı her zaman 4 değişmiyo sadece değişen kişilerin sayıları hangi konuyu araştırmam gerekiyo?
Ayrıca sayılar yüksek miktarda olabiliyo 5000 gibi
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