【问题标题】:Asp.net pivot tableAsp.net 数据透视表
【发布时间】:2011-03-24 21:52:13
【问题描述】:

我的客户在他的电子商务数据库中有两个表

No(PK), PropertyName

No(PK), ProductNo(FK), PropertyNo(FK), Value

他只是想让我做一张那样的桌子

+-----------+-------------+--------------+------------+
|           | Property 1  | Property 2   | .. all properties-> | 
+-----------+-------------+--------------+------------+
| Product1  |      x      |     4        |      x     |
| Product2  |      2      |     x        |      1     |
| Product3  |      x      |     x        |      x     |
|   ...     |             |              |            |
| (all products)          |              |            |
+----+-------------+---------------------+------------+

我试图通过中继器实现它,但我做不到。我怎样才能实现它?


我放弃并以@Bala R 的身份提出了解决方案 但是有一点变化……

示例类

public class list {
        public int No { get; set; }
        public string PropertyName { get; set; }
    }

    public class list2 {
        public int ProductNo { get; set; }
        public int PropertyNo { get; set; }
        public int Value { get; set; }

    }
    public class list3 {
        public string ProductName { get; set; }
        public int No { get; set; }

    }

样本列表,

        List<list> propertyList = new List<list>();
        List<list2> propertyProductList = new List<list2>();
        List<list3> productList = new List<list3>();
        propertyList.Add(new list { No = 1, PropertyName=  "Property 1" });
        propertyList.Add(new list { No = 2, PropertyName = "Property 2" });
        propertyList.Add(new list { No = 3, PropertyName = "Property 3" });
        propertyList.Add(new list { No = 4, PropertyName = "Property 4" });

        propertyProductList.Add(new list2 { ProductNo = 1,  PropertyNo = 1, Value = 3 });
        propertyProductList.Add(new list2 { ProductNo = 2, PropertyNo = 3, Value = 13 });
        propertyProductList.Add(new list2 { ProductNo = 2, PropertyNo = 2, Value = 8 });
        propertyProductList.Add(new list2 { ProductNo = 3, PropertyNo = 2, Value = 6 });
        propertyProductList.Add(new list2 { ProductNo = 4, PropertyNo = 1, Value = 2 });
        propertyProductList.Add(new list2 { ProductNo = 3, PropertyNo = 1, Value = 55 });


        productList.Add(new list3 { No = 1, ProductName = "Ball" });
        productList.Add(new list3 { No = 2, ProductName = "Book" });
        productList.Add(new list3 { No = 3, ProductName = "Pencil" });
        productList.Add(new list3 { No = 4, ProductName = "TV" });

以及解决方案,

        var resultSet = (from c in list2
                         group c by c.ProductNo into g
                          select new {
                              ProductNo = g.Key,
                              Value = g
                          }).ToList();
        DataTable dt = new DataTable();
        dt.Columns.Add(new DataColumn("Products"));
        foreach (var item in list) {
            dt.Columns.Add(new DataColumn() { ColumnName = item.PropertyName });
        }
        foreach (var item in resultSet) {
            DataRow dr = dt.NewRow();
            dr["Products"] = list3.First(p=> p.No== item.ProductNo).ProductName;
            foreach (var item2 in item.Value) {
                dr[list.First(l=>l.No == item2.PropertyNo).PropertyName] = item2.Value;
            }
            dt.Rows.Add(dr);
        }
        dataGrid1.DataSource = dt;
        dataGrid1.DataBind();

【问题讨论】:

  • 你能发布你的中继器代码吗?
  • 放弃服务器控件并使用 LINQ to SQL 和字符串生成器构建它。
  • 还有你的代码?您如何将数据源与转发器相关联?
  • 您要转置数据吗?这可以在 sql 中完成:stackoverflow.com/questions/2987078/…
  • @CRice 我认为这篇文章对我很有帮助,谢谢。并感谢所有回复。

标签: c# asp.net data-binding pivot-table


【解决方案1】:

你可以像这样创建类

    class Product
    {
        public int ProductNo { get; set; }
        public string ProductName { get; set; }
    }

    class Property
    {
        public int PropertyNo { get; set; }
        public string PropertyName { get; set; }
    }

    class Value
    {
        public int ProductPropertyNo { get; set; }
        public int ProductNo { get; set; }
        public int PropertyNo { get; set; }
        public string Value { get; set; }
    }

并加载枚举

        IEnumerable<Product> products = GetProducts();
        IEnumerable<Property> properties = GetProperties();
        IEnumerable<Value> values = GetValues();

为 DataTable 做这样的事情

        DataTable dt = new DataTable();

        dt.Columns.Add(new DataColumn("ProductName"));

        foreach (var propNo in values.Select(v => v.PropertyNo).Distinct())
        {
            dt.Columns.Add(
                new DataColumn(properties.Where(p => p.PropertyNo == propNo).First().PropertyName));


        }

        foreach (var prodNo in  values.Select(v => v.ProductNo).Distinct())
        {
            Product  prod = products.Where(p => p.ProductNo == prodNo).First();

            DataRow dr = dt.NewRow();
            dr["ProductName"] = prod.ProductName;
            foreach (var value in values.Where(v => v.ProductNo == prodNo))
            {
                Property prop = properties.Where(p => p.PropertyNo == value.PropertyNo).First();
                dr[prop.PropertyName] = value.Value;
            }
        }

【讨论】:

【解决方案2】:

我不是DataTable 的忠实粉丝,但在这种情况下,这是实现这一目标的最简单方法。首先创建一个列“产品”,然后为每个属性在DataTable 上创建一个新列。 为您的所有产品添加DataRows,并在相应的属性列中填写值。

然后将DataTable 绑定到DataGrid

【讨论】:

  • 感谢您的回答.. 实际上我也不是 DataTable 的忠实粉丝,但是是的,这似乎是最简单的方法。但是无论如何都与转发器和更多内联代码有关。我既不想使用数据表,也不想使用任何服务器端控件事件,如 ItemDataBound。
  • 您不需要使用服务器端事件。只是 dataGrid.DataSource = yourTable; dataGrid.DataBind();就完成了。
  • 哇!我开始编写一些代码示例并被其他事情分心,然后我回来,完成并发布它只是为了看到这个答案。这是相同的想法,但我想代码会有所帮助。
  • 我会在我 15 岁时给 +1 :)
猜你喜欢
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
  • 2015-06-25
  • 2023-04-11
相关资源
最近更新 更多