【问题标题】:How do you restructure a dataset before binding it to a gridview?在将数据集绑定到 gridview 之前,如何重构数据集?
【发布时间】:2014-02-09 19:18:26
【问题描述】:

我正在从我的数据库中检索一个 DataSet,但我想以不同的方式呈现它,而不是它的返回方式。我目前有看起来像第一个表的行,我在 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"]),
                 };


}

【问题讨论】:

    标签: c# asp.net gridview dataset


    【解决方案1】:

    您需要分组和旋转以获得结果。

    1. 您需要一个新的对象列表或DataTable 来存储最终结果
    2. 您需要识别唯一的命名对(Ansvarig / Name)
    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

    【讨论】:

    • 哇没想到会有这么好的答案,现在我只需要让这个傻瓜输出到我的gridview。:)
    • @Kolla 我会亲自尝试远离 DataSet 并创建一个类来保存这些对象。它使整个过程更容易。然后你可以有一个通用的 List.
    • 是的,我必须阅读它,因为我不知道该怎么做。:)
    • 以为我可以将 dt 绑定到网格,但无法正常工作
    猜你喜欢
    • 1970-01-01
    • 2013-03-27
    • 2012-10-09
    • 2013-03-31
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多