0

状況は、次のようなグリッド ビューでテーブルを作成する必要があるということです。

----------| ID---|---名前--|--1/2002--|--2/2002--|--1/2003--|......| 2009 年 2 月 |
顧客1--|
Cust2--|
:
:
データベースに 2 つのテーブルがあります - 顧客と注文、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 が年の前半または後半を示す形式 t/year でその列を生成し、その生成された列に、その年のそのセッションでの各顧客の注文を割り当てる方法 (コストのみを表示する) についての手がかりが必要です。

[編集]

今のところ、私は次のようなことを試みています:

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;
        }

ここで、必要な列を生成しました。キーが列名で、値がその列の順序であるディクショナリに順序がありますが、その列にバインドする助けが必要です

4

2 に答える 2

0

私が見た方法は、たとえば、必要なプロパティを持つクラスを作成することです。

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クラスを変更する必要があることです。

いずれにせよ、これがあなたにスタートを与えることを願っています。

于 2009-05-04T14:39:02.517 に答える
0

行の更新/追加/削除がない限り、そのグリッドを手動で生成するだけだと思います。

顧客のリストと、どの年/セッションでの販売数のカウントをフェッチします。次に、フォームでそのリストを取得し、必要な列を作成します。

于 2009-05-05T11:40:38.943 に答える