Generieren von Spalten in GridView (C#, LINQ)
-
03-07-2019 - |
Frage
Die Situation ist, dass ich eine Tabelle in der Rasteransicht erstellen muss, die so aussieht:
---------- | Id --- | --- name-- |--1/2002-- | --2/2002-- |--1/2003- | ........ | 2/2009 |
Cust1--|
Cust2--|
:
:
Ich habe zwei Tabellen in der Datenbank – Kunden und Bestellungen, über LINQ to SQL DataContext
ID und Name der Kunden, die ich aus einer einfachen Abfrage erhalte
var custInfo = from cust in db.Customers
select new { ID = cust.Id,
FullName = cust.FirstName + " " + cust.LastName }
dataGridOrdersPreview.DataSource = custInfo;
Und ich brauche einen Hinweis, wie man diese Spalten im Format t/Jahr generiert, wobei t das erste oder zweite Halbjahr des Jahres angibt, und wie man diesen generierten Spalten die Bestellungen jedes Kunden in dieser Sitzung des Jahres zuordnet (wobei nur die Kosten angezeigt werden).
[bearbeiten]
Bisher versuche ich so etwas:
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")
};
(In „Kosten“ werden nur die summierten Kosten in dieser Jahressitzung für jeden Kunden erfasst.)
Und dann denke ich darüber nach, die Jahre und Sitzungen durchzusetzen und die Abfrageergebnisse irgendwie zu entsprechenden Spalten zu bekommen
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;
}
Hier habe ich Spalten generiert, die ich möchte, und ich habe Befehle im Wörterbuch, wobei der Schlüssel der Spaltenname und der Wert die Befehle in dieser Spalte sind, aber ich brauche Hilfe beim Binden an diese Spalten
Lösung
Die Art und Weise, wie ich es getan habe, ist, eine Klasse zu erstellen, die die Eigenschaften hat, die Sie zum Beispiel möchten,
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;}
}
Verwenden Sie dann das System.windows.Forms.BindingSource, nennen Sie es, dass CudordedsbindingSource und die Datenquelle auf eine Liste Ihrer neuen Klasse festlegen.
List<CustOrders> myListOfCustOrders = new List<CustOrders>();
/* Code to populate myListOfCustOrders */
CustOrdsBindingSource.DataSource = myListOfCustOrders;
In diesem Fall müssen Sie den Code schreiben, um jedes Ergebnis Ihrer Abfrageergebnisse in eine Instanz von Beachtchen umzuwandeln und in MyListOfCustorders aufzubewahren.
Schließlich muss auch die Datenquelle der Netzansicht festgelegt werden:
gridView1.DataSource = CustOrdsBindingSource;
Das große Problem, das ich bei diesem Ansatz sehe, ist, dass Sie jedes Jahr die Haftklasse ändern müssen, es sei denn, es gibt einige Voodoo, die einige vorschlagen können, Eigenschaften zur Laufzeit in die Klasse einzufügen.
In jedem Fall hoffe ich, dass Sie einen Start haben.
Andere Tipps
Solange keine Zeilen aktualisiert/hinzugefügt/gelöscht werden, würde ich das Raster meiner Meinung nach einfach manuell erstellen.
Rufen Sie die Kundenliste und die Anzahl der Verkäufe in welchem Jahr/in welcher Sitzung ab.Nehmen Sie dann im Formular diese Liste und erstellen Sie die erforderlichen Spalten.