C# Listview'e Veri Basma?
-
Hocalar merhaba
C#'ta listview'e veri basarken kullanacağım ideal yöntemi işi bilen insanlara sormak istedim.
Siparis adında bir sınıfım var ve içeriği şu şekilde:
public class Siparis { public int siparisID { get; set; } public string siparisNo { get; set; } public int tedarikciID { get; set; } public DateTime siparisVerilmeTarihi { get; set; } public DateTime siparisTeslimTarihi { get; set; } public bool siparisDurumu { get; set; } public string siparisAciklama { get; set; } public string siparisIcerik { get; set; } }
Ana formun yapılandırıcı metodunun içeriği de şu şekilde:
public SiparisTakip() { InitializeComponent(); Database.dbConnect(); // Veritabanından siparişleri çeken komutum ve altında o verileri listeleyen komutum. MySqlCommand komut = new MySqlCommand("Select * from siparisler", Database.baglan); MySqlDataReader listele = komut.ExecuteReader(); // Döngüye sokup sipariş kayıtlarını alıyorum. while (listele.Read()) { // Her yeni sipariş için bir obje oluşturuyorum ve nesnenin içindeki özelliklere verileri aktarıyorum. Siparis siparis = new Siparis(); siparis.siparisNo = listele["siparisNo"].ToString(); siparis.siparisAciklama = listele["siparisAciklama"].ToString(); // Listview itemlerini burda doldurucam. ListViewItem siparisSatirlari = new ListViewItem("1"); siparisSatirlari.SubItems.Add(siparis.siparisNo); siparisSatirlari.SubItems.Add(siparis.siparisAciklama); // Ardından oluşturduğum her bir sipariş nesnesini listenin içine ekliyorum. lvSiparisListesi.Items.Add(siparisSatirlari); } }
Sormak istediğim soru şu: Her yeni kayıt için döngü içerisinde yeni bi obje oluşturmak programa ek yük olarak döner mi? Bu kullanıma gerek var mıdır?
Sadece veriyi çekip döngü içinde ListViewItem ile Siparis sınıfını kullanmadan ListView içine atmak bana ne kaybettirir? Üstteki kullanımın bana sağladığı en önemli şey OOP mantığına uyması mıdır? -
merhaba,
1-Her yeni kayıt için döngü içerisinde yeni bi obje oluşturmak programa ek yük olarak döner mi?
# Bilgisayarlarin bellekleri artik 128 mb degil hocam, sikinti yaratmaz. Ancak sorgundan milyonlarca kayit dönüyorsa böyle yapmak bastan beri mantiksizlik olur. Paging yapmani öneririm
2- Bu kullanıma gerek var mıdır?
# Bir datatable i datasource olarak kullanabilirsin. Ya da surrogate class yazarak istenilen propertyleri alabilirsin ve varsa eklemeler yapabilirsin
3- Sadece veriyi çekip döngü içinde ListViewItem ile Siparis sınıfını kullanmadan ListView içine atmak bana ne kaybettirir?
# Kodunda siparis sinifi gereksiz durmus zaten hocam. Onun yerine direk text olarak ekleyebilirdin.
4- Üstteki kullanımın bana sağladığı en önemli şey OOP mantığına uyması mıdır?
# OOP mantigini zaten hic kuramamissin. Sana tavsiyem her metodun yapmasi gereken bir is oldugunu düsün. Ancak bu constructor birden fazla is yapiyor ve gördügüm kadariyla bir winform un kurucu methodu. N-tier sekilde calismaya bak. Projenin büyüklügünü bilmiyorum ancak db deki verileri handle etmek icin icin Data Access Layer (DAL), bu verileri cagirip, düzenleyen ve GUI ye gönderen yani bir köprü vazifesi gören Business Logic Layer (BLL) ve de view lerini barindirdigin GUI projesini ayirabilirsin. Aslinda daha farkli seyler de yapabilirsin ama basitce bu mantik üzerinden baslamani tavsiye ederim. Böylece verileri cekme olayini DAL'a, bu verileri isteyip-isleyecen-gönderen isini BLL ye, kullaniciya gösterme isini de GUI (Views) e verebilirsin. Burada dikkat etmen gereken GUI nin hic bir sekilde DAL ile isinin olmamasi. Kapsamina göre bir de Model projesi olusturabilirsin ya da Entity Framework kullaniyorsan DB first ile otomatik olarak classlarini yaratabilirsin.
-
Sipariş diye bir arraysınıfı yaparsın ve static olarak tanımlarsın X , Y , Z Ekranlarında seçilen siparişin Unique id göre bir ararsın array sınıfı içerisinde . Aranan objeyi bulursun birdaha bahsettiğim X,Y,Z ekranlarında bu objenin verilerini kullanırsın.
Bu programa hız katar ama bellekden refakat edersin. Yani şöyle ki. Bahsettiğim ekranlarda Tıklanılan sipariş unique id (veya başka bir key) çekip bunu tekrar sorgulayıp veritabanından dataları çekmek ekstra zaman demektir.
Başka aklıma birşey gelmedi. Birde elindeki dataları ne kadar nesneye dökersen yönetimi o kadar kolaylaşır. Yani yarın öbürgün X Bir kişisine sen şu ekranı yap sana bu şekilde bir Sınıf göndereceği parametreler şunlar değişkenler şunlar dediğinde kişi veritabanından bağımsız senin vermiş olduğun sınıfa göre sana bir method veya ekran artık her ne ise yazar..
Obje yaparsan UML/USE-CASE diyagramlarının yönetimini daha basit hale getirirsin zaten sınıfla yapmazsan biraz karmaşık olacaktır (Benim görüşüm).
OOP iyidir iyi olmasa Entitiy framework olmazdı hacı abi :D :D
EDİT ; @unbalanced benden önce davranmış zaten dediklerimi okumayıp es geçebilirsin :D
EDİT 2: Aman ha tüm databaseyi bi oje içerisine atıp da ordan arama yapma dediklerimden böyle birşey çıkarma lütfen . Bazı programlarda bu yapılıyor. Adam tüm tabloyu bi sınıf içerisine alıyor. Sen gerekli olan datayı çek en az düzeyde sakla. Tüm datayı çekme. asla.....
MhmdAlmz tarafından 26/Tem/17 00:43 tarihinde düzenlenmiştir -
Hocam bende nacizane fikrimi soyliyim sana
1 ) Entity framework kullan.
2) Bir mimari kullan - Senin durumunda 3 layer architecture isni gorebilir
3) Data binding kullan
4) Generic Types kullan
Su konuya bir goz at @unbalanced cok iyi anlatmisti
https://www.tahribat.com/forum/c-entityframework6-datagridviewcomboboxcolumn-ile-229756
-
hocalar cevaplarınız için çok teşekkür ederim.
yazdığım kodun amatörce olduğunun farkındaydım. verdiğiniz cevaplar zaten düşünmem gereken şeylerin adlandırılmış bi biçimde somut dışavurumu gibi olmuş.
ufkumu biraz daha açtığınız, kendimi geliştirmem gereken doğrultuyu gösterdiğiniz için tekrar teşekkürler.