Question

La situation est la suivante: je dois créer un tableau en mode grille ressemblant à ceci:

---------- | ID --- | --- Nom-- | --1 / 2002-- | --2 / 2002-- | --1 / 2003-- | ........ | 2/2009 |
Cust1--

Cust2--

:
:
J'ai deux tables dans la base de données - Clients et commandes, via LINQ to SQL DataContext
Identifiant et nom des clients que je reçois à partir d'une requête simple

var custInfo = from cust in db.Customers
               select new { ID = cust.Id, 
                            FullName = cust.FirstName + " " + cust.LastName } 


dataGridOrdersPreview.DataSource = custInfo;

Et j’ai besoin d’indications sur la manière de générer ces colonnes au format t / année, où t indique le premier ou le deuxième semestre de l’année, et d’affecter à cette colonne générée les commandes de chaque client lors de la session de l’année. (affichant uniquement les coûts)

[edit]

Pour l'instant, je tente quelque chose comme ceci:

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

(Dans Coût, obtenir uniquement les coûts cumulés de la session de cette année pour chaque client)

et puis je pense à itérer à travers les années et les sessions et obtenir en quelque sorte les résultats de la requête dans les colonnes correspondantes

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

Ici, j'ai généré des colonnes que je veux et j'ai des ordres dans le dictionnaire où Key est le nom de la colonne et Value sont des ordres dans cette colonne, mais j'ai besoin d'aide pour le lier à ces colonnes

Était-ce utile?

La solution

Comme je l'ai déjà vu, vous créez une classe qui possède les propriétés souhaitées, par exemple,

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

Ensuite, utilisez System.Windows.Forms.BindingSource, appelez-le CustOrdsBindingSource et définissez son source de données sur une liste de votre nouvelle classe.

List<CustOrders> myListOfCustOrders =  new List<CustOrders>();
/* Code to populate myListOfCustOrders */
CustOrdsBindingSource.DataSource = myListOfCustOrders;

Dans ce cas, vous devrez écrire le code pour convertir chaque résultat des résultats de votre requête en une instance de CustOrders et le stocker dans myListOfCustOrders.

Enfin, la source de données de la vue en grille devra également être définie:

gridView1.DataSource = CustOrdsBindingSource;

Le gros problème que je vois avec cette approche est qu’il vous faudra changer la classe CustOrders tous les ans, sauf s’il existe un vaudou que certains peuvent suggérer d’insérer des propriétés dans la classe au moment de l’exécution.

Quoi qu'il en soit, j'espère que cela vous donne un début.

Autres conseils

Tant qu'il n'y aura pas de mise à jour / ajout / suppression de lignes, je pense que je générerais cette grille manuellement.

Récupérez la liste des clients et le nombre de ventes réalisées en quelle année / session. Et ensuite, dans le formulaire, prenez cette liste et créez les colonnes nécessaires.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top