Merhaba, C# ListView Veri Çekme, Ekleme, Silme ve Fazlası yazım ile C# eğitim setime devam ediyorum. Bu dersimizde ListView nesnesinin bir kaç özelliğine bakacağız. ListView veritabanından veri çekip göstereceğiz, veri ekleyip sileceğiz ve mükerrer kayıt kontrolü işlemlerini yapacağız. Geçen günlerde ListView hakkında soru gelmişti. Bu sebeple c# listview kullanımı dersi ekleme gereği hissettim.
C# ListView Veri Çekme, Ekleme, Silme ve Fazlası
Bu dersimizde;
- Veri Ekleme
- Veri Silme
- Benzersiz Alan Kontrolü
- Mükerrer Kayıt Kontrolü
- Veritabanından Veri Çekme ve Gösterme
konularının hepsine bakacağız. Daha önce bu nesnenin bu kadar detaylı bir nesne olduğunu bilmiyordum açıkçası. Bir kaç ufak ayarla DataGridView benzeri bir hale bürünüyor. Bu dersimizde de aslında bu hali üzerinden gideceğiz.
İlk olarak aşağıdaki gibi bir form tasarımı yapalım. Bu ders biraz uzun olacağından aşağıdaki gibi bir tasarım bize lazım olacak.
Şimdi ListView nesnemizi bir bir datagridview gibi görünüme kavuşturalım ve 4 tane kolon ekleyelim. TC, ADI, SOYADI, TELEFONU kolonları olsun. Listview için yapacağımız hazırlamayı bir metoda alıyoruz.
void Ayarla() { listView1.Clear(); listView1.View = View.Details; listView1.GridLines = true; listView1.FullRowSelect = true; listView1.Columns.Add("TC", 100); listView1.Columns.Add("ADI", 100); listView1.Columns.Add("SOYADI", 100); listView1.Columns.Add("TELEFONU", 100); }
Ayarla buttonumuzun click eventine metodumuzu yazalım.
private void btn_ayarla_Click(object sender, EventArgs e) { Ayarla(); }
Form açıldığında ListView nesnemiz boş gelecek. Ayarla butonuna bastığımızda kolonlar ve grid çizgileri eklenecek.
C# ListView Veri Ekleme
Şimdi kolonlarını eklediğimiz ListView nesnemize veri ekleme işlemine bakalım. Ekle butonunun Click eventine gelelim.
private void btn_ekle_Click(object sender, EventArgs e) { if (txt_ad.Text.Trim() == "" || txt_soyad.Text.Trim() == "" || txt_tc.Text.Trim() == "") MessageBox.Show("*'lı alanlar boş olamaz."); else { string[] row = { txt_tc.Text, txt_ad.Text, txt_soyad.Text, txt_tel.Text }; var satir = new ListViewItem(row); bool TC = TC_Kontrol(txt_tc.Text); bool Mukerrer = Mukerrer_Kontrol(satir); if (Mukerrer) MessageBox.Show("Aynı bilgilere sahip başka bir kayıt zaten mevcut"); else { if (TC) MessageBox.Show("Aynı TC bilgisine sahip başka bir kayıt zaten mevcut"); else listView1.Items.Add(satir); } } }
Kodları açıklamam gerekirse;
- İlk olarak boş geçilemez alanları yapıyoruz. Ad, Soyad ve TC alanları boş geçilemez.
- Satır adında bir dizi oluşturuyoruz. Bu dizi ile ListView nesnemize satır ekleyeceğiz. Buradaki veri alacağımız nesnelerin sıralaması önemlidir.
- Elimizdeki diziyi bir ListViewItem nesnesi haline getiriyoruz.
- Aynı TC numaralı iki kayıt istemediğimiz için burada bir TC kontrolü yapıyoruz. Kodları birazdan vereceğim.
- Mükerrer kayıt olmasını istemediğimiz için burada bir mükerrer kayıt kontrolü yapıyoruz. Kodları birazdan vereceğim.
- Eğer Mükerrer _Kontrol metodumuzdan True değeri dönerse, kayıt etmek istediğimiz satır mükerrer demektir.
- TC_Kontrol metodumuzdan True değeri dönerse, kayıt etmek istediğimiz satırdaki TC numarası ile başka kayıt var demektir.
- Kontrollerden False değerleri dönerse satırı ekliyoruz.
C# ListView Veri Silme
Gelelim listview satır silme işlemine…
private void btn_sil_Click(object sender, EventArgs e) { try { listView1.Items.Remove(listView1.SelectedItems[0]); } catch (ArgumentOutOfRangeException) { MessageBox.Show("Listeden bir seçim yapmalısınız."); } }
Seçilmiş olan satırı sileceğiz ama eğer bir satıra tıklanmamışsa ArgumentOutOfRangeException döneceğinden Try Catch ile yakalayıp uyarı veriyoruz.
C# ListView Benzersiz Alan Kontrolü
Burada TC_Kontrol metodumuzu veriyorum.
private bool TC_Kontrol(string TC) { bool b = false; for (int i = 0; i < listView1.Items.Count; i++) { if (listView1.Items[i].SubItems[0].Text == TC) { b = true; break; } } return b; }
Kodları açıklamak gerekirse;
- Geri dönüş değeri olarak kullanmak için bir bool değişken tanımladık
- Bir for döngüsü başlatıyoruz. Listview nesnesindeki item sayısı kadar dönecek.
- Listview içindeki bir satırın ilk subitem yani ilk kolondaki verisi ile kayıt etmek istediğimiz TC aynı ise;
- Değişkenimizi True yapıyoruz ve döngüyü kırıyoruz.
- Kayıt etmek istediğimiz TC var olduğundan geri dönüş için True olarak ayarladığımız değişkeni veriyoruz.
C# ListView Mükerrer Kayıt Kontrolü
Mukerrer_Kontrol metodumuzu veriyorum.
private bool Mukerrer_Kontrol(ListViewItem lvi) { bool b = false; int kolon_sayi = listView1.Columns.Count; int kontrol = 0; for (int i = 0; i < listView1.Items.Count; i++) { kontrol = 0; for (int j = 0; j < listView1.Items[i].SubItems.Count; j++) { if (listView1.Items[i].SubItems[j].Text == lvi.SubItems[j].Text) { kontrol++; } } if (kontrol == kolon_sayi) { b = true; break; } else { b = false; } } return b; }
Kodları açıklamak gerekirse;
- Geri dönüş değeri olarak kullanmak için bir bool değişken tanımladık.
- ListView nesnesindeki kolon sayısını aldık.
- Kontrol için kontrol değişkeni tanımladık.
- Listview satırları arasında döngü hazırladık.
- Her satırdaki subitem’ler için ayrı ayrı kontrol yapacağımızdan Kontrol değişkenini sıfırladık.
- Sırası ile listview item’ler arasında gezerken, listviewitem’ler içindeki subitemler arasında gezinmek için döngü başlattık.
- (Kısacası listview içindeki tüm hücreleri kontrol edeceğiz.)
- Mevcut index numaralı listviewitem içindeki, mevcut subitem’in Text’i ile eklemek istediğimiz listviewitem içindeki aynı indexte yer alan subitem’in Text’i aynı ise;
- (Yani ilk hücredeki veri ile, eklemek istediğimiz satırın ilk hücresi aynı ise…)
- kontrol değişkenini 1 arttırıyoruz
- Eğer bir satırdaki tüm hücrelerdeki veriler aynı ise eklemek istediğimiz kayıt mükerrer olacaktır. Eğer kolon sayısı ile kontrol edilen ve aynı veriye sahip olan hücre sayısı aynı ise;
- satırdaki tüm bilgiler eklemek istediğimiz satırdaki bilgiler ile aynıdır. Bu yüzden bool değişkenimizi True yaparak döngüyü kırıyoruz.
- Geri dönüş olarak bool değişkenimizi gösteriyoruz
C# ListView Veri Çekme ve Gösterme
Burada veritabanından çektiğimiz verileri listview’de göstereceğiz. Bunun için önce verileri bir DataTable’ye yükleyeceğiz. Bu noktada sql’e bağlanma ve verileri alma kısmını sizin yaptığınızı varsayıyorum.
Burada kodla örnek bir DataTable hazırladım. Siz veritabanından çektiğiniz verileri bu DataTable’ye yüklersiniz. Oluşturduğum DataTable bu şekilde….
static DataTable GetTable() { DataTable table = new DataTable(); table.Columns.Add("TC_dt", typeof(string)); table.Columns.Add("ADI_dt", typeof(string)); table.Columns.Add("SOYADI_dt", typeof(string)); table.Columns.Add("TELEFONU_dt", typeof(DateTime)); table.Rows.Add(25252525251, "David", "Indocin", DateTime.Now); table.Rows.Add(50505050501, "Sam", "Enebrel", DateTime.Now); table.Rows.Add(10101010101, "Christoff", "Hydralazine", DateTime.Now); table.Rows.Add(21212121211, "Janet", "Combivent", DateTime.Now); table.Rows.Add(10010010010, "Melanie", "Dilantin", DateTime.Now); return table; }
Şimdi, burada bilmeniz gereken şey, DataTable içindeki kolonların da verilerle birlikte alınması gerekiyor. Yani hem kolonları hem verileri alacağız.
private void btn_vt_cek_Click(object sender, EventArgs e) { listView1.Clear(); foreach (var item in GetTable().Columns) { listView1.Columns.Add(item.ToString(), 100); } foreach (DataRow row in GetTable().Rows) { ListViewItem item = new ListViewItem(row[0].ToString()); for (int i = 1; i < GetTable().Columns.Count; i++) { item.SubItems.Add(row[i].ToString()); } listView1.Items.Add(item); } }
Öncelike ListView’i temizliyoruz. Eğer temizleme yapmazsak var olan kolonlara ek olarak buradaki kolonlar eklenecektir.
Eğer burada kullanacağınız ListView’i her zaman veritabanından çekeceğiniz bilgilerle dolduracaksanız, ilk foreach’ı silebilirsiniz. Yani, Ayarla() metodunu Form_Load eventi içinde kullanırsınız ve kolonlar eklenmiş olur. Yukarıdaki metotta yer alan ilk foreach döngüsünü silerek sadece verileri alabilirsiniz.
İkinci foreach ve for döngüsü de DataTable’deki verileri hücre hücre ListView nesnesine ekliyor. Aşağıda tüm formun kodlarını görebilirsiniz.
C# ListView Veri Çekme Tüm Proje Kodları
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace testler_yazilar_icin { public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void Form2_Load(object sender, EventArgs e) { } private void btn_ayarla_Click(object sender, EventArgs e) { Ayarla(); } void Ayarla() { listView1.Clear(); listView1.View = View.Details; listView1.GridLines = true; listView1.FullRowSelect = true; listView1.Columns.Add("TC", 100); listView1.Columns.Add("ADI", 100); listView1.Columns.Add("SOYADI", 100); listView1.Columns.Add("TELEFONU", 100); } private void btn_ekle_Click(object sender, EventArgs e) { if (txt_ad.Text.Trim() == "" || txt_soyad.Text.Trim() == "" || txt_tc.Text.Trim() == "") MessageBox.Show("*'lı alanlar boş olamaz."); else { string[] row = { txt_tc.Text, txt_ad.Text, txt_soyad.Text, txt_tel.Text }; var satir = new ListViewItem(row); bool TC = TC_Kontrol(txt_tc.Text); bool Mukerrer = Mukerrer_Kontrol(satir); if (Mukerrer) MessageBox.Show("Aynı bilgilere sahip başka bir kayıt zaten mevcut"); else { if (TC) MessageBox.Show("Aynı TC bilgisine sahip başka bir kayıt zaten mevcut"); else listView1.Items.Add(satir); } } } private bool Mukerrer_Kontrol(ListViewItem lvi) { bool b = false; int kolon_sayi = listView1.Columns.Count; int kontrol = 0; for (int i = 0; i < listView1.Items.Count; i++) { kontrol = 0; for (int j = 0; j < listView1.Items[i].SubItems.Count; j++) { if (listView1.Items[i].SubItems[j].Text == lvi.SubItems[j].Text) kontrol++; } if (kontrol == kolon_sayi) { b = true; break; } else b = false; } return b; } private bool TC_Kontrol(string TC) { bool b = false; for (int i = 0; i < listView1.Items.Count; i++) { if (listView1.Items[i].SubItems[0].Text == TC) { b = true; break; } } return b; } private void btn_sil_Click(object sender, EventArgs e) { try { listView1.Items.Remove(listView1.SelectedItems[0]); } catch (ArgumentOutOfRangeException) { MessageBox.Show("Listeden bir seçim yapmalısınız."); } } static DataTable GetTable() { DataTable table = new DataTable(); table.Columns.Add("TC_dt", typeof(string)); table.Columns.Add("ADI_dt", typeof(string)); table.Columns.Add("SOYADI_dt", typeof(string)); table.Columns.Add("TELEFONU_dt", typeof(DateTime)); table.Rows.Add(25252525251, "David", "Indocin", DateTime.Now); table.Rows.Add(50505050501, "Sam", "Enebrel", DateTime.Now); table.Rows.Add(10101010101, "Christoff", "Hydralazine", DateTime.Now); table.Rows.Add(21212121211, "Janet", "Combivent", DateTime.Now); table.Rows.Add(10010010010, "Melanie", "Dilantin", DateTime.Now); return table; } private void btn_vt_cek_Click(object sender, EventArgs e) { listView1.Clear(); foreach (var item in GetTable().Columns) { listView1.Columns.Add(item.ToString(), 100); } foreach (DataRow row in GetTable().Rows) { ListViewItem item = new ListViewItem(row[0].ToString()); for (int i = 1; i < GetTable().Columns.Count; i++) { item.SubItems.Add(row[i].ToString()); } listView1.Items.Add(item); } } } }
C# ListView Veri Çekme, Ekleme, Silme ve Fazlası yazımda bu kadardı arkadaşlar. Bu dersi Github’a yükleme gereği görmedim.
C Sharp Eğitim Seti eğitimi sayfasına gitmek için tıklayınız. Derslerime özel olarak hazırladığım Github Projeme bu bağlantıdan ulaşabilirsiniz…
Bu yazı, sitemdeki 422. yazıdır…
Sağlıcakla ve takipte kalın. ;)
Güzel anlatım.Kolona göre sıralamada olsa güzel olurdu.
Merhaba,
Bunun için hem listviewden hem de metin belgesinden silme kodlarını yazmanız gerek.
Daha kısa şekilde çözmek içinde, verileri listview’e değil, metin belgesine ekler ve listview’e metin belgesinden okunan verileri gösterirsiniz. Listview’den benzersiz bilgiyi (Örn ID) alır metin belgesinden silersiniz ve metin belgesindeki verileri tekrar okuyarak tekrar listview’de gösterirsiniz. Sorunuzu bu şekilde çözebilirsiniz.
İyi Çalışmalar.
listview de seçilen satırdaki bütün elemanları aynı zaman da o verileri kayıt ettiğimiz text(metin dosyasısından nasıl sileceğiz)
Teşekkürler :)
güzel eline sağlık