Asp.net 数据透视表
我的客户在他的电子商务数据库中有两张表
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();
My customer has two table in his eCommerce DB
No(PK), PropertyName
and
No(PK), ProductNo(FK), PropertyNo(FK), Value
He just want me to make a table like that
+-----------+-------------+--------------+------------+
| | Property 1 | Property 2 | .. all properties-> |
+-----------+-------------+--------------+------------+
| Product1 | x | 4 | x |
| Product2 | 2 | x | 1 |
| Product3 | x | x | x |
| ... | | | |
| (all products) | | |
+----+-------------+---------------------+------------+
I tried to make it via repeater but i couldn't. How can I achieve it?
I give up and made the solution as @Bala R
But a little changes...
The sample classes
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; }
}
The sample lists,
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" });
and the solution,
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();
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以创建这样的类
并加载枚举
,并对 DataTable 执行类似的操作
You can create classes like this
and load enumerations
and do something like this for DataTable
我不是
DataTable
的忠实粉丝,但在本例中,这是实现这一目标的最简单方法。首先创建一个列“Product”,然后在DataTable
上为每个属性创建一个新列。为您的所有产品添加
DataRows
,并在相应的属性列中填写值。然后将
DataTable
绑定到DataGrid
。I'm not a big fan of
DataTable
but in this case it's the easiest way to achieve that. Create first a Column "Product" and then for each property create a new Column on theDataTable
.Add
DataRows
for all your Products and fill out the Value in the appropriate Property Column.Afterwards bind the
DataTable
to aDataGrid
.aspx:
代码隐藏:
aspx :
Code Behind :