2014-01-20 39 views
1

我从我的数据库中检索DataSet,但我想以不同的方式呈现它,然后返回它。我目前有行看起来像这个第一个表,我在gridview中显示这些。将数据集绑定到gridview之前如何重构数据集?

我现在想要重构数据,以便输出将像第二个表一样。我并不总是得到相同的“周”,所以我必须检查我有哪些星期,并遍历它们来重建数据。我通过“var结果”来做到这一点,但我不知道如何正确使用返回周的结果来构建我的gridview。

|------------------------------------------| 
| Ansvarig | Name   | Week | Tid | 
|------------------------------------------| 
| John Doe | John Andersson | 4  | 29,0 | 
| John Doe | John Andersson | 5  | 0,0 | 
| John Doe | John Andersson | 5  | 0,0 | 
| John Doe | John Andersson | 13 | 8,0 | 
| John Doe | Anders Cameron | 4  | 8,0 | 
| John Doe | Anders Cameron | 12 | 11,0 | 
| John Doe | Steve Smith | 4  | 8,0 | 
| John Doe | Steve Smith | 6  | 0,0 | 
| John Doe | Steve Smith | 6  | 0,0 | 
| John Doe | Steve Smith | 7  | 0,0 | 


|-----------------------------------------------------------------------------------------| 
| Ansvarig | Name   | Week 4 | Week 5 | Week 6 | Week 7 | Week 12 | Week 13 | 
|-----------------------------------------------------------------------------------------| 
| John Doe | John Andersson | 29,0 | 0,0  | 0,0  | 0,0  |   | 8,0  | 
| John Doe | John Andersson | 29,0 | 0,0  | 0,0  | 0,0  |   | 8,0  | 
| John Doe | Anders Cameron | 8,0 |   |   |   | 11,0  |   | 
| John Doe | Steve Smith | 8,0 |   | 0,0  | 0,0  |   |   | 
| John Doe | Steve Smith | 8,0 |   | 0,0  | 0,0  |   |   | 


protected void update_Click1(object sender, EventArgs e) 
{ 
    TimeView view = new TimeView(); 
    DataSet ds = view.TimeOverview(fromDatum, tomDatum, ansvarig, anvandare); 



    GridView1.DataSource = ds; 
    GridView1.DataBind(); 


    DataView dv = new DataView(ds.Tables[0]); 
    dv.Sort = "Vecka"; 

    var result = from row in ds.Tables[0].AsEnumerable() 
       where 1 == 1 
       group row by new { weeknumber = row["Week"] } into g 
       select new 
       { 
        weekMax = g.Max(x => x["Week"]), 
       }; 


} 

回答

2

您需要进行分组和旋转才能得到结果。

  1. 你需要一个新的对象列表或DataTable存储的最终结果
  2. 您需要确定独特的命名对(Ansvarig /名称)
  3. 您需要动态地添加一周列
  4. 你需要返回结果DataTable或对象列表

一种解决方案看起来像下面这样:

using System; 
using System.Data; 
using System.Xml; 
using System.Data.Linq; 
using System.Data.DataSetExtensions; 
using System.Linq; 

public class Program 
{ 
    public void Main() 
    { 
     var results = GetResults(GetTestData()); 

     foreach(DataColumn dc in results.Columns) 
     { 
      Console.Write("{0},", dc.ColumnName); 
     } 

     Console.WriteLine(); 

     foreach(DataRow dr in results.Rows) 
     { 
      foreach(DataColumn dc in results.Columns) 
      { 
       Console.Write("{0},", dr[dc.ColumnName]); 
      } 
      Console.WriteLine(); 
     } 
    } 

    private DataTable GetResults(DataSet ds) 
    { 
     var result = (from row in ds.Tables[0].AsEnumerable() 
       let ansvarig = row.Field<string>("Ansvarig") 
       let name = row.Field<string>("Name") 
       let week = row.Field<int>("Week") 
       let tid = row.Field<double>("Tid") 
       group row by new { ansvarig, name, week } into grp 
       select new 
       { 
        Ansvarig = grp.Key.ansvarig, 
        Name = grp.Key.name, 
        Week = grp.Key.week, 
        Total = grp.Sum(r => r.Field<double>("Tid")) 
       }).ToList(); 

     var uniqueWeeks = result 
          .Select(item => new { Week = item.Week }) 
          .OrderBy(x => x.Week) 
          .Distinct() 
          .ToList(); 

     var dt = new DataTable(); 
     dt.Columns.Add(new DataColumn("Ansvarig", typeof(System.String))); 
     dt.Columns.Add(new DataColumn("Name", typeof(System.String))); 

     // add week columns 
     foreach(var item in uniqueWeeks) 
     { 
      Console.WriteLine("Week: {0}", item.Week); 
      dt.Columns.Add(new DataColumn(string.Format("Week {0}", item.Week), typeof(System.String))); 
     } 

     // add rows 
     foreach (var item in result) 
     { 
      var foundRow = dt.AsEnumerable().FirstOrDefault(r => r.Field<string>("Ansvarig") == item.Ansvarig && r.Field<string>("Name") == item.Name); 
      if (foundRow == null) 
      { 
       var dr = dt.NewRow(); 
       dr["Ansvarig"] = item.Ansvarig; 
       dr["Name"] = item.Name; 
       dr[string.Format("Week {0}", item.Week)] = item.Total; 
       dt.Rows.Add(dr); 
      } 
      else 
      { 
       foundRow[string.Format("Week {0}", item.Week)] = item.Total; 
      } 
     } 

     return dt; 
    } 

    private DataSet GetTestData() 
    { 
     var ds = new DataSet(); 
     var dt = new DataTable(); 
     dt.Columns.Add(new DataColumn("Ansvarig", typeof(System.String))); 
     dt.Columns.Add(new DataColumn("Name", typeof(System.String))); 
     dt.Columns.Add(new DataColumn("Week", typeof(System.Int32))); 
     dt.Columns.Add(new DataColumn("Tid", typeof(System.Double))); 

     var dr = dt.NewRow(); 

     dr["Ansvarig"] = "John Doe"; 
     dr["Name"] = "John Andersson"; 
     dr["Week"] = 4; 
     dr["Tid"] = 29; 

     dt.Rows.Add(dr); 

     dr = dt.NewRow(); 
     dr["Ansvarig"] = "John Doe"; 
     dr["Name"] = "John Andersson"; 
     dr["Week"] = 5; 
     dr["Tid"] = 0; 

     dt.Rows.Add(dr); 

     dr = dt.NewRow(); 
     dr["Ansvarig"] = "John Doe"; 
     dr["Name"] = "John Andersson"; 
     dr["Week"] = 5; 
     dr["Tid"] = 0; 

     dt.Rows.Add(dr); 

     dr = dt.NewRow(); 
     dr["Ansvarig"] = "John Doe"; 
     dr["Name"] = "John Andersson"; 
     dr["Week"] = 13; 
     dr["Tid"] = 8; 

     dt.Rows.Add(dr); 

     dr = dt.NewRow(); 
     dr["Ansvarig"] = "John Doe"; 
     dr["Name"] = "Anders Cameron"; 
     dr["Week"] = 4; 
     dr["Tid"] = 8; 

     dt.Rows.Add(dr); 

     dr = dt.NewRow(); 
     dr["Ansvarig"] = "John Doe"; 
     dr["Name"] = "Anders Cameron"; 
     dr["Week"] = 12; 
     dr["Tid"] = 11; 

     dt.Rows.Add(dr); 

     dr = dt.NewRow(); 
     dr["Ansvarig"] = "John Doe"; 
     dr["Name"] = "Steve Smith"; 
     dr["Week"] = 4; 
     dr["Tid"] = 8; 

     dt.Rows.Add(dr); 

     dr = dt.NewRow(); 
     dr["Ansvarig"] = "John Doe"; 
     dr["Name"] = "Steve Smith"; 
     dr["Week"] = 6; 
     dr["Tid"] = 0; 

     dt.Rows.Add(dr); 

     dr = dt.NewRow(); 
     dr["Ansvarig"] = "John Doe"; 
     dr["Name"] = "Steve Smith"; 
     dr["Week"] = 6; 
     dr["Tid"] = 0; 

     dt.Rows.Add(dr); 

     dr = dt.NewRow(); 
     dr["Ansvarig"] = "John Doe"; 
     dr["Name"] = "Steve Smith"; 
     dr["Week"] = 7; 
     dr["Tid"] = 0; 

     dt.Rows.Add(dr); 

     ds.Tables.Add(dt); 

     return ds; 
    } 
} 

不完全是漂亮,但它会输出:

Ansvarig,Name,Week 4,Week 5,Week 6,Week 7,Week 12,Week 13, 
John Doe,John Andersson,29,0,,,,8, 
John Doe,Anders Cameron,8,,,,11,, 
John Doe,Steve Smith,8,,0,0,,, 

工作小提琴:http://dotnetfiddle.net/UgpXDN

+0

哇,没想到这样一个很好的答案,现在我只是要得到这个吸盘输出到我的GridView控件。 :) – Kolla

+1

@Kolla我会亲自尝试并远离DataSet并创建一个类来容纳这些对象。它使整个过程更容易。然后你可以有一个通用名单。 – Junto

+0

是的,我将不得不阅读它,因为我不知道如何去做:) – Kolla