【问题标题】:Generating Columns in GridView ( C#, LINQ )在 GridView 中生成列(C#、LINQ)
【发布时间】:2009-05-04 12:44:31
【问题描述】:

情况是,我需要在网格视图中创建表格,如下所示:

---------| ID---|---姓名---|--1/2002--|--2/2002--|--1/2003--|........| 2/2009 |
客户1--|
客户2--|
:
:
我在 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 是该列中的订单,但我需要一些帮助将其绑定到该列

【问题讨论】:

  • 您如何决定展示哪些年份?您是否展示了其中有订单或预定义金额(例如 7 年价值)的每一年?
  • 显示从2002年到实际年份的每一年,如果没有订单,则单元格为空

标签: c# linq-to-sql datagridview datasource


【解决方案1】:

我看到的方法是创建一个具有您想要的属性的类,例如,

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 类,除非有一些巫术可以建议在运行时将属性插入到类中。

不管怎样,我希望这能给你一个开始。

【讨论】:

  • 实际年份自动更新对我来说非常重要,但感谢您的回答,我会试一试。
【解决方案2】:

只要不会更新/添加/删除行,我想我会手动生成该网格。

获取客户列表以及在哪一年/哪个时段的销售数量。然后在表单中获取该列表并创建所需的列。

【讨论】:

    猜你喜欢
    • 2019-03-13
    • 2018-05-17
    • 2010-11-28
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多