none
datatable'da verileri senelere göre ayırıp ara toplam maaş tutarlarını datagridview'de göstermek RRS feed

  • Soru

  • iyi çalışmalar. datatable da isimler,seneler ve maaşlar alanı olduğunu varsayalım. ben senelere göre isimlerin maaşlarını ara toplam olarak datagridview de göstermek istiyorum. asp.net örnekleri var işin içinden çıkamadım. yapmaya çalıştığım:yapmaya çalıştığım


    nigDELI

    23 Kasım 2020 Pazartesi 15:47

Yanıtlar

  •         private void Form1_Load(object sender, EventArgs e)
            {
                DataTable dt = new DataTable();
                dt.Columns.Add(new DataColumn("isim", typeof(string)));
                dt.Columns.Add(new DataColumn("yıl", typeof(string)));
                dt.Columns.Add(new DataColumn("maaş", typeof(int)));

                DataTable son_dt = new DataTable();
                son_dt = dt.Copy();

                //data girişi
                DataRow row = dt.NewRow();
                row[0] ="Ali";
                row[1] = "2014";
                row[2] = 2000;
                dt.Rows.Add(row);

                row = dt.NewRow();
                row[0] = "Mehmet";
                row[1] = "2014";
                row[2] = 3000;
                dt.Rows.Add(row);

                row = dt.NewRow();
                row[0] = "Veli";
                row[1] = "2015";
                row[2] = 3500;
                dt.Rows.Add(row);

                row = dt.NewRow();
                row[0] = "Ali";
                row[1] = "2015";
                row[2] = 2500;
                dt.Rows.Add(row);

                row = dt.NewRow();
                row[0] = "Mustafa";
                row[1] = "2015";
                row[2] = 4000;
                dt.Rows.Add(row);

                row = dt.NewRow();
                row[0] = "Ali";
                row[1] = "2016";
                row[2] = 5000;
                dt.Rows.Add(row);            

                var veri = dt.AsEnumerable().GroupBy(u => u["yıl"]);

                foreach (var item in veri)
                {
                    int toplam_maas = 0;
                    foreach (var dr in item)
                    {
                        toplam_maas += int.Parse(dr["maaş"].ToString());
                        DataRow drow = son_dt.NewRow();
                        drow["yıl"] = item.Key.ToString();
                        drow["isim"] = dr["isim"].ToString();
                        drow["maaş"] = dr["maaş"].ToString();
                        son_dt.Rows.Add(drow);                
                    }
                    DataRow totalRow = son_dt.NewRow();
                    totalRow["yıl"] = "Toplam";
                    totalRow["maaş"] = toplam_maas.ToString();
                    son_dt.Rows.Add(totalRow);
                }
                DataRow total2Row = son_dt.NewRow();
                total2Row["yıl"] = "Genel Toplam";
                total2Row["maaş"] = Convert.ToDouble(dt.Compute("SUM(maaş)", ""));
                son_dt.Rows.Add(total2Row);
                dataGridView1.DataSource = son_dt;
            }

    nigDELI

    • Yanıt Olarak İşaretleyen Emin DOĞU 26 Kasım 2020 Perşembe 15:22
    26 Kasım 2020 Perşembe 15:17

Tüm Yanıtlar

  • void Main()
    {
    	var myData = new List<Data>(){
    	 new Data(){Name="Ali",Year=2014,Salary=2},
    	 new Data(){Name="Mehmet",Year=2014,Salary=3},
    	 new Data(){Name="Veli",Year=2015,Salary=3.5m},
    	 new Data(){Name="Ali",Year=2015,Salary=2.5m},
    	 new Data(){Name="Mustafa",Year=2015,Salary=4},
    	 new Data(){Name="Ali",Year=2016,Salary=5},
    	};
    	
    	myData.GroupBy(x=>x.Year).Select(x=> x.Sum(y=>y.Salary)).Dump();
    }
    
    public sealed class Data {
     public string Name{get;set;}
     public int Year{get;set;}
     public decimal Salary {get;set;}
    
    }
    

    23 Kasım 2020 Pazartesi 21:22
  • çok özür diliyorum ama bilgimin yetersiz olması sebebiyle anladığım sadece 1 satır linq koduyla sorunu hallettiğiniz. sizden ricam direk datatable üzerinden örnek verebilirseniz benimde datagridviewe bağlamam kolay olur. yine affınıza sığınarak 1 satırla bu iş yapılabilir mi?

    nigDELI

    24 Kasım 2020 Salı 09:02
  • Şu şekilde deneyebilirsiniz Emin bey : 

    void Main()
    {
        #region LuzumsuzSatirlar
    	var myData = new List<Data>(){
    	 new Data(){Name="Ali",Year=2014,Salary=2},
    	 new Data(){Name="Mehmet",Year=2014,Salary=3},
    	 new Data(){Name="Veli",Year=2015,Salary=3.5m},
    	 new Data(){Name="Ali",Year=2015,Salary=2.5m},
    	 new Data(){Name="Mustafa",Year=2015,Salary=4},
    	 new Data(){Name="Ali",Year=2016,Salary=5},
    	};
    	
    	
    	var dTable = new DataTable();
    	dTable.Columns.Add("Name");
    	dTable.Columns.Add("Year");
    	dTable.Columns.Add("Salary");
    	
    	dTable.Columns[1].DataType= typeof(Int32);
    	dTable.Columns[2].DataType= typeof(decimal);
    	
    	foreach(var veri in myData){
    	DataRow _row = dTable.NewRow();
    	_row["Name"] = veri.Name;
    	_row["Year"] = veri.Year;
    	_row["Salary"] = veri.Salary;
    	dTable.Rows.Add(_row);
    	}
    	#endregion
    	
    	
    	myData.GroupBy(x=>x.Year).Select(x=> x.Sum(y=>y.Salary)).Dump();
    	
    	
    	Console.WriteLine(dTable);
    	Console.WriteLine(dTable.AsEnumerable().GroupBy(x=>x.Field<int>("Year")).Select(x=> new{ Year=x.Key , Total= x.Sum(y=> (decimal)y.Field<decimal>("Salary"))}));
    	
    	
    }
    
    public sealed class Data {
     public string Name{get;set;}
     public int Year{get;set;}
     public decimal Salary {get;set;}
    
    }

    24 Kasım 2020 Salı 16:37
  • ne yazıkki kodunuz çözüm değil. dump genişletme metodu bulunamadı hatasının dışında kodunuzu projeye adapte edebilmem de olanaksız gibi duruyor. lüzumsuz satırlar lüzumsuzsa neden ekli? benim datatable'min içi zaten verdiğim örnekteki gibi dolu. yoksa ben bunu datagrid de nasıl göstereyim? sadece senelere göre row eklenecek ama zıkkım kodun emsali internette yok malesef!


    nigDELI

    25 Kasım 2020 Çarşamba 06:40
  • Yıl kolonuna "Toplam" yazmışsınız. Çözüm bulamamanız normal.

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

    25 Kasım 2020 Çarşamba 11:47
    Moderatör
  • table ye row ekliyoruz yılı ben string belirttiysem yıl yerine "toplam" da yazabilirim. mehmet emin kaymaz beyin yolundan giderek sorunu çözdüm. hatta tek satır daha az kodla. bu sorunu yaşayanlar için tam bir örnek vereceğim. zaman yetersizliğinden yarın paylaşacağım inşallah. çok basit olsa da formlarda yanıtı olmayan bir konu olmuş olacak.

    nigDELI

    25 Kasım 2020 Çarşamba 15:39
  •         private void Form1_Load(object sender, EventArgs e)
            {
                DataTable dt = new DataTable();
                dt.Columns.Add(new DataColumn("isim", typeof(string)));
                dt.Columns.Add(new DataColumn("yıl", typeof(string)));
                dt.Columns.Add(new DataColumn("maaş", typeof(int)));

                DataTable son_dt = new DataTable();
                son_dt = dt.Copy();

                //data girişi
                DataRow row = dt.NewRow();
                row[0] ="Ali";
                row[1] = "2014";
                row[2] = 2000;
                dt.Rows.Add(row);

                row = dt.NewRow();
                row[0] = "Mehmet";
                row[1] = "2014";
                row[2] = 3000;
                dt.Rows.Add(row);

                row = dt.NewRow();
                row[0] = "Veli";
                row[1] = "2015";
                row[2] = 3500;
                dt.Rows.Add(row);

                row = dt.NewRow();
                row[0] = "Ali";
                row[1] = "2015";
                row[2] = 2500;
                dt.Rows.Add(row);

                row = dt.NewRow();
                row[0] = "Mustafa";
                row[1] = "2015";
                row[2] = 4000;
                dt.Rows.Add(row);

                row = dt.NewRow();
                row[0] = "Ali";
                row[1] = "2016";
                row[2] = 5000;
                dt.Rows.Add(row);            

                var veri = dt.AsEnumerable().GroupBy(u => u["yıl"]);

                foreach (var item in veri)
                {
                    int toplam_maas = 0;
                    foreach (var dr in item)
                    {
                        toplam_maas += int.Parse(dr["maaş"].ToString());
                        DataRow drow = son_dt.NewRow();
                        drow["yıl"] = item.Key.ToString();
                        drow["isim"] = dr["isim"].ToString();
                        drow["maaş"] = dr["maaş"].ToString();
                        son_dt.Rows.Add(drow);                
                    }
                    DataRow totalRow = son_dt.NewRow();
                    totalRow["yıl"] = "Toplam";
                    totalRow["maaş"] = toplam_maas.ToString();
                    son_dt.Rows.Add(totalRow);
                }
                DataRow total2Row = son_dt.NewRow();
                total2Row["yıl"] = "Genel Toplam";
                total2Row["maaş"] = Convert.ToDouble(dt.Compute("SUM(maaş)", ""));
                son_dt.Rows.Add(total2Row);
                dataGridView1.DataSource = son_dt;
            }

    nigDELI

    • Yanıt Olarak İşaretleyen Emin DOĞU 26 Kasım 2020 Perşembe 15:22
    26 Kasım 2020 Perşembe 15:17