En iyi yanıtlayıcılar
El ile oluşturulan DataTable nesnesinin veri ekleme işlemi sonrasında durumunun korunması

Soru
-
Merhabalar,
bir kaç adet textbox kontrolüm var buradan aldığım bilgileri el ile oluşturduğum datatable gönderiyorum. Fakat her ekleme işleminde datatable önceki eklenen verileri tutmuyor, son eklenen veriyi gösteriyor. Bu durumu nasıl düzeltebilirim ?
// Datatable için column oluşturan ve verileri datatable ekleyen metodum. dt_renkler nesnem global alanda oluşturulmyştur.
private void dt_SecilenRenkleri_Ekle(String RenkKodu, String RenkAdi) { if (dt_renkler.Columns.Count == 0) { dt_renkler.Columns.Add("RENKKODU", typeof(string)); dt_renkler.Columns.Add("RENKADI", typeof(string)); } DataRow dr = dt_renkler.NewRow(); dr["RENKKODU"] = RenkKodu; dr["RENKADI"] = RenkAdi; dt_renkler.Rows.Add(dr); }
// Ekleme işlemini gerçekleştirdiğim butonumun click olayı
dt_SecilenRenkleri_Ekle(TxtRenkKodu.Text, txtRenkAdi.Text); GridSecilenRenkler.DataSource = dt_renkler; GridSecilenRenkler.DataBind();
Yanıtlar
-
Son sorunuzu anlamadım, ama silme işlemi Index ile direk yapılabiliyor;
var _list = (List<Renk>)Session["Renkler"]; //index ile silme //2. elemanı siler; _list.RemoveAt(1); //elemanı bulup silme; _list.Remove(_list.Where(p=>p.RenkAdı=="Mavi").Single());
Bunun yanında Dictionary<T> yapısı da var, o da elemanlara key verip kullanmak için. Merak eden olursa onuda anlatırız.
e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
- Yanıt Olarak İşaretleyen Gökmen Küçük 1 Nisan 2013 Pazartesi 08:19
Tüm Yanıtlar
-
Global alanda derken session gibi mi? Eğer değilse o nesne örnekleri yeniden oluşturulacağından her seferinde boş olur.
Birde DataTable yerine neden IEnumerable kullanmıyorsunuz? bence daha rahat edersiniz. Örnek;
Renk.cs
public class Renk { public string RenkKodu { get; set; } public string RenkAdı { get; set; } }
Global.asax
private void OnSessionStart() { Session.Add("Renkler", new List<Renk>()); }
Bu listeye renk eklerken;
((List<Renk>)Session["Renkler"]).Add(new Renk() { RenkKodu = "1", RenkAdı = "Mavi" });
Bir yerde kullanırken;
Repeater1.DataSource = Session["Renkler"];
e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
- Düzenleyen Önay YALÇINERModerator 29 Mart 2013 Cuma 18:06
- Yanıt Olarak Öneren Süleyman_güzel 29 Mart 2013 Cuma 18:49
-
Önay bey yanıtınız için çok teşekkürler,
Session kullanmak istemememin sebebi bu yapıda bir kaç modülümün ve alışveriş sepetinin bulunması. Sessiona çok veri yüklemek istemiyorum ve oturum süresinden dolayı.
Ben sorunumu şu şekilde çözdüm, datatable nesnemi class içerisine taşıdım static olarak tanımladım. DataTable nesnesine veri ekleyen methodumuda class içerisine taşıyarak çözüm getirdim.
Dediğiniz gibi sorunum sayfa her postback işleminde datatable nesnesi yeniden oluşuyordu.
iki yada üç boyutlu durumlarda List<> yapısını hiç kullanmadım, datatable nesnesi mi daha verimli olur yoksa List<> mi çünkü datatable nesne mi bir data kontrolüne bağlayıp gerektiğinde silme işlemi yapıyorum. Bu konuda bilgi verebilirseniz sevinirim.
-
Öncelikle static class ile çözüm olmaz. Denemek için sitenizi iki farklı browser ile açın sepetlere ürün ekleyin, birbirinin sepetlerini görecekler. Static classınız her session için ayrı-ayrı açılmaz tüm application için bir tane açılır.
Session kullanın bir sorun olmaz, yinede olacağını düşünüyorsanız Cookie kullanabilirsiniz, hem böylece kullanıcıların sepetleri her oturum açışlarında boşalmaz.
Generic List kullanımının bir çok avantajı olur, en önemlisi üzerinde Linq çalıştırabilirsiniz. DataTable Rows larında da linq çalıştırabilirsiniz ama bu kadar esnek olmayabilir. DataTable classı Typed DataSet ile kullanıldığında rahatlık oluyor ama benim favorim Entity Data Model
List<T> ekleme çıkarma işlemleri de çok rahat.
e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
-
-
-
Son sorunuzu anlamadım, ama silme işlemi Index ile direk yapılabiliyor;
var _list = (List<Renk>)Session["Renkler"]; //index ile silme //2. elemanı siler; _list.RemoveAt(1); //elemanı bulup silme; _list.Remove(_list.Where(p=>p.RenkAdı=="Mavi").Single());
Bunun yanında Dictionary<T> yapısı da var, o da elemanlara key verip kullanmak için. Merak eden olursa onuda anlatırız.
e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
- Yanıt Olarak İşaretleyen Gökmen Küçük 1 Nisan 2013 Pazartesi 08:19
-
Teşekkürler önay bey index ile silme işlemiyle sorunumu çözdüm.
int index = GridOzellikler.Rows[e.RowIndex].RowIndex; List<Ozellikler> ozellik = ((List<Ozellikler>)Session["SecilenOzellikler"]); ozellik.RemoveAt(index);
Dictionary<T> konusunda bahsederseniz sevinirim. İyi çalışmalar.
-
Dictionary<T>, List<T> nin biraz yeteneklisi. Liste içindeki elemanlara benzersiz object tipli key vererek ekleniyor, daha sonra bu key ile liste içinden elemanlara tekrar ulaşılabiliyor. Örnek;
Dictionary<string, Renk> _renkler = new Dictionary<string, Renk>(); _renkler.Add("Mavi", new Renk() { RenkAdı = "Mavi", RenkKodu = "101" }); _renkler.Add("Sarı", new Renk() { RenkAdı = "Sarı", RenkKodu = "102" }); _renkler.Add("Kırmızı", new Renk() { RenkAdı = "Kırmızı", RenkKodu = "103" }); _renkler.Add("Yeşil", new Renk() { RenkAdı = "Yeşil", RenkKodu = "104" }); Console.WriteLine(_renkler["Mavi"].RenkKodu);
//ya da
_renkler.Remove(_renkler["Mavi"]);
e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
- Düzenleyen Önay YALÇINERModerator 1 Nisan 2013 Pazartesi 10:38
-
-