GridViewでの列の生成(C#、LINQ)
-
03-07-2019 - |
質問
状況は、次のようなグリッドビューでテーブルを作成する必要があることです:
---------- | ID --- | ---名前-| --1 / 2002-- | --2 / 2002-- | --1 / 2003-- | ........ | 2009年2月|
Cust1-- |
Cust2-- |
:
:
dbに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 / 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;
}
ここで、必要な列を生成し、キーが列名で値がその列の順序である辞書に順序がありますが、その列にバインドするためのヘルプが必要です
解決
これまでに見てきた方法は、たとえば、必要なプロパティを持つクラスを作成することです
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クラスを変更する必要があることです。
どちらにしても、これがあなたの出発点になることを願っています。
他のヒント
行の更新/追加/削除が行われない限り、そのグリッドを手動で生成します。
顧客のリストと、年/セッションごとの売上数を取得します。次に、フォームでそのリストを取得し、必要な列を作成します。