在GridView中生成列(C#,LINQ)
-
03-07-2019 - |
题
情况是,我需要在网格视图中创建表格,如下所示:
---------- | ID --- | ---名称 - | --1 / 2002-- | --2 / 2002-- | --1 / 2003-- | ........ | 2/2009 |
Cust1-- |点击
Cust2-- |点击
:点击
:点击
我在db中有两个表 - 客户和订单,通过LINQ to SQL DataContext
我从简单查询中获得的客户的ID和名称
var custInfo = from cust in db.Customers
select new { ID = cust.Id,
FullName = cust.FirstName + " " + cust.LastName }
dataGridOrdersPreview.DataSource = custInfo;
我需要一些线索,如何以t / year格式生成列,其中t表示一年中的第一个或第二个半年,并为每个客户在该年度的会话中的订单分配给生成的列(仅显示费用)
[编辑]
就目前而言,我正在尝试这样的事情:
var orders = from ord in db.Orders
group ord by ord.Id_cust into grouped
let costs = grouped
.Where( s => s.YearSession == session && s.Year == year)
.Select(a => new { Costs = a.Cost ) } )
select new { ID = grouped.Key,
Name = custInfo
.Where( a => a.ID == grouped.Key)
.Select( j => j.Name).Single(),
Cost = ExtensionLibrary.Sum(costs, "\n")
};
(在成本中仅获得每个客户在该年度会话中的总计费用)
然后我考虑迭代这些年和会议并获得 不知何故,查询结果到相应的列
while (year <= DateTime.Today.Year)
{
year++;
while (session < 2)
{
session++;
dataGridOrdersPreview.Columns.Add(session +"/"+ year);
col.Add((session +"/"+ year),
orders.Select( a => a.Cost ).ToList() );
/* col is Dictionary<string, List<string> > */
}
session = 0;
}
这里我生成了我想要的列,我在Dictionary中有订单,其中Key是列名,Value是该列中的订单,但是我需要一些帮助将它绑定到那些列
解决方案
我看到它完成的方法是创建一个具有所需属性的类,例如,
class CustOrders
{
public string CustName {get; set;}
public int Orders2002-1 {get; set;}
public int Orders2002-2 {get; set;}
...
public int Orders2009-1 {get; set;}
}
然后使用System.Windows.Forms.BindingSource,调用它说CustOrdsBindingSource并将其DataSource设置为新类的列表。
List<CustOrders> myListOfCustOrders = new List<CustOrders>();
/* Code to populate myListOfCustOrders */
CustOrdsBindingSource.DataSource = myListOfCustOrders;
在这种情况下,您必须编写代码以将查询结果的每个结果转换为CustOrders的实例并将其存储在myListOfCustOrders中。
最后,还必须设置网格视图的数据源:
gridView1.DataSource = CustOrdsBindingSource;
我用这种方法看到的一个大问题是你必须每年更改一次CustOrders类,除非有些巫术可以建议在运行时将属性插入到类中。
无论哪种方式,我希望这会给你一个开始。
其他提示
只要不会更新/添加/删除行,我想我只会手动生成该网格。
获取客户列表以及年/会话中的销售数量。然后在表单中获取该列表并创建所需的列。