none
El ile oluşturulan DataTable nesnesinin veri ekleme işlemi sonrasında durumunun korunması RRS feed

  • 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();

    28 Mart 2013 Perşembe 18:46

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
    MCC

    1 Nisan 2013 Pazartesi 06:33
    Moderatör

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
    MCC


    29 Mart 2013 Cuma 18:00
    Moderatör
  • Ö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.

    30 Mart 2013 Cumartesi 08:12
  • Ö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
    MCC

    30 Mart 2013 Cumartesi 09:08
    Moderatör
  • Sepet uygulaması için tabiki session kullanıcam sadece bi önceki işlem için böyle bir çözüm üretmiştim. Fakat o zaman birden fazla kişi aynı anda ürün eklerken sıkıntı çıkacağını fark ettim :)) 
    30 Mart 2013 Cumartesi 09:31
  • Önay bey Listeden veri silerken örneğin RenkAdi = "Mavi" dediğimde datatable gibi satır olarakmı siliyor ?
    30 Mart 2013 Cumartesi 09:59
  • 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
    MCC

    1 Nisan 2013 Pazartesi 06:33
    Moderatör
  • 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.

    1 Nisan 2013 Pazartesi 08:18
  • 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
    MCC


    1 Nisan 2013 Pazartesi 10:36
    Moderatör
  • Önay bey herhangi bir değeri güncellemek istesek nasıl yapmalıyız ?
    13 Nisan 2013 Cumartesi 08:43
  • _renkler[0] = new Renk() {Adı = "Siyah", Kodu = "000" };
    

    gibi direk eşitleyerek

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC

    13 Nisan 2013 Cumartesi 12:06
    Moderatör