Meilleur auteur de réponses
Remplissage datagridview

Question
-
Bonjour,
J'ai un datagridview que je dois remplir avec des données provenant d'une liste qui a plusieur champs de meme type
mais qui devront etre groupé pour etre affiché dans la datagridview.
voici une image de ce que j'ai fait jusque là:
Mais le probleme est que je n'arrive pas inserer les quantités de produit commandé pour chaque client
Ici j'affiche ligne par ligne les commandes des client, alors qu'il serait mieux de pouvoir grouper les noms des clients pour avoir un meilleur apperçu des commandes. et la dernière colonne "valeur totale" dois en principe etre additionnées. (pour ça j'ai une petite idée)
Thanks
- Modifié Hervino 14 mercredi 28 septembre 2011 00:53 correction
Réponses
-
Bonjour,
Bon… donc le nombre des colonnes est variable. Dans ce cas… il est un peu difficile obtenir le résultat directement par une requête SQL ou par LINQ to SQL (peut-être par un curseur dans une procédure stockée).
Pour simplifier les choses, il faut seulement modifier le mode dans lequel vous faites le remplissage de votre DataGridView. Vous fait le remplissage par colonnes, mais il faut le faire par ligne, quelque chose comme ça :
if (requete.Count() > 0) { int ligne = -1; string userName = ""; int total = 0; for (int j = 0; j < requete.Count(); j++) { string currentUser = requete[j].Prenom + " " + requete[j].Nom; if (! currentUser.Equals(userName)) { if (ligne > 0) dgvCommandes[dgvCommandes.ColumnCount - 5, ligne].Value = total; total = 0; ligne++; userName = currentUser; dgvCommandes[0, ligne].Value = userName; for (int i = 1; i < dgvCommandes.ColumnCount - 5; i++) //premiere colonne est le nom de l'utilisateur { dgvCommandes[i, ligne].Value = "-"; } } for (int i = 1; i < dgvCommandes.ColumnCount - 5; i++) { if (dgvCommandes.Columns[i].HeaderText == requete[j].Designation) { dgvCommandes[i, ligne].Value = requete[j].QuantiteCmd; } } total += requete[j].MontantTot; } }
Je n’ai pas testé le code, mais normalement le changement de votre algorithme pour faire le remplissage par ligne devrait résoudre votre problème.
Un dernier aspect à revoir : il pourrait être nécessaire trier la liste obtenue par votre requête par le nom et prénom d’utilisateurs pour être sûr que les lignes spécifiques à chaque utilisateur sont consécutives dans votre liste.
Bonne journée,
Cipri
Ciprian DUDUIALA, MSFT  
•Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.
- Marqué comme réponse Hervino 14 lundi 3 octobre 2011 23:53
-
Bonsoir,
Oui… ma faute… Après l’instruction for pour le variable j il faut insérer de nouveau la ligne :
dgvCommandes[dgvCommandes.ColumnCount - 5, ligne].Value = total;
et ca va résoudre votre problème. Plus précis :
for (int j = 0; j < requete.Count(); j++)
{
…
total += requete[j].MontantTot;
}
dgvCommandes[dgvCommandes.ColumnCount - 5, ligne].Value = total;
Cordialement,
Cipri
Ciprian DUDUIALA, MSFT  
•Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.
- Marqué comme réponse Hervino 14 lundi 3 octobre 2011 23:53
Toutes les réponses
-
Bonjour,
Pouvez-vous nous montrer très rapidement sous excel ce que vous souhaitez faire précisement ?
Cordialement
Gilles TOURREAU - MVP C#
Architecte .NET/Consultant/Formateur chez Winwise
Blog : http://gilles.tourreau.fr
- MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
- MCITP : SQL Server 2008 Developper
- MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5 -
Bonjour,
Pour cela, il faut que vous fassiez la logique de groupement avant d'effectuer le binding avec la datagridview. Si les données proviennent d'une fiche excel, xml ou base de données, vous pouvez utiliser la clause group by dans votre requête afin de remonter la collection que vous voulez afficher dans la gridview.
Cordialement,
aelassas.free.fr -
Bonjour, Hervino 14,
Est-ce que vous avez résolu votre problème ? Dans l’affirmative, merci de tenir la communauté informée sur la suite de vos démarches. Sinon, pouvez-vous svp nous donner plus des détails (peut-être nous montrer votre code) ?
Cordialement,
Cipri
Ciprian DUDUIALA, MSFT  
•Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.
-
je voulais juste signaler que les données de la liste proviennent d'une requete linq et de cette requete je rempli le datagridview mais pas comme je le veux. en principe les valeurs de la premiere ligne doivent etre repris une seule fois et les quantité d'articles commandés sont defini dans la meme ligne.
voici quelque ligne de code qui permettent de remplir ma liste:
var requete = (from ac in dbProxy.ArticlesCommandes group ac by new { ac.id_employe, ac.nom, ac.prenom, ac.designation,ac.prix_vente , ac.T1, ac.T2, ac.T3} into ac2 select new { Nom= ac2.Key.nom, Prenom= ac2.Key.prenom, Designation = ac2.Key.designation, QuantiteCmd = ac2.Sum(ac => ac.quantite_cmd), interet = ac2.Sum(ac => ac.interet), PrixUnit = ac2.Key.prix_vente, MontantTot = ac2.Sum(ac => ac.prix_total), }).ToList();
et puis un autre bout de code qui permet de remplir le datagridview:
for (int i = 0; i < dgvCommandes.ColumnCount - 5; i++)//colonne { for (int j = 0; j < requete.Count; j++)//ligne req_art_com.Count { dgvCommandes[0, j].Value = requete[j].Prenom + " " + requete[j].Nom;//req_art_com[j].em.nom + " " + req_art_com[j].em.prenom; //lesEmployesEntr(type)[j].nom + " " + lesEmployesEntr(type)[j].postnom; if (dgvCommandes.Columns[i].HeaderText == requete[j].Designation) { dgvCommandes[i, j].Value = requete[j].QuantiteCmd; } else { dgvCommandes[i, j].Value = "-";}
<span style="white-space:pre"> </span> dgvCommandes[dgvCommandes.ColumnCount - 5, j].Value = requete[j].MontantTot;
} }
en gros c'est ça. -
Bonjour,
Si j’ai bien compris, vous voulez avoir toutes les informations concernant une certaine personne sur une seule ligne et le totale sera le totale de toutes ses commandes.
Pouvez-vous svp nous donner aussi le schéma de la table ArticlesCommandes et quelques explications sur la signification de chaque colonne ? Puis, je voulais aussi savoir si le nombre des colonnes de votre DataGridView est fixe et s’il est variable, dites-nous svp comment vous décidez leur nombre et leurs noms.
Cordialement,
Cipri
Ciprian DUDUIALA, MSFT  
•Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.
-
Bonjour, Ciprian
Oui vous avez compris ce que je souhaite faire. Je signale que ArticleCommande est une vue et non une table, j'ai opter pour une vue pour ne pas avoir a faire trop de jointure avec linq.
Voici donc la structure de ArticlesCommandes:
Pour la taille du datagridview je dirais qu'elle est de taille fixe quand je dois la remplir mais variable selon le nombre d'articles commandés. Voilà comment je procède:
1- je défini le header de la 1ere colonne qui est celle du nom
2- je crée un tableau de colonnes qui ont pour header les noms des articles, pour ça je sais que les articles commencent par la 2e colonne après le nom, (je signale que j'obtiens les noms des produits dans la base des données) que j'insère dans le datagridview
3- je rempli juste 2 autre colonnes qui reste
A ce stade j'ai un datagridview vide mais qui a déjà toutes les colonnes possibles.
J’espère que ça vous éclaircira.
Merci bien
- Modifié Hervino 14 lundi 3 octobre 2011 08:52 correction erreur
-
Bonjour,
Bon… donc le nombre des colonnes est variable. Dans ce cas… il est un peu difficile obtenir le résultat directement par une requête SQL ou par LINQ to SQL (peut-être par un curseur dans une procédure stockée).
Pour simplifier les choses, il faut seulement modifier le mode dans lequel vous faites le remplissage de votre DataGridView. Vous fait le remplissage par colonnes, mais il faut le faire par ligne, quelque chose comme ça :
if (requete.Count() > 0) { int ligne = -1; string userName = ""; int total = 0; for (int j = 0; j < requete.Count(); j++) { string currentUser = requete[j].Prenom + " " + requete[j].Nom; if (! currentUser.Equals(userName)) { if (ligne > 0) dgvCommandes[dgvCommandes.ColumnCount - 5, ligne].Value = total; total = 0; ligne++; userName = currentUser; dgvCommandes[0, ligne].Value = userName; for (int i = 1; i < dgvCommandes.ColumnCount - 5; i++) //premiere colonne est le nom de l'utilisateur { dgvCommandes[i, ligne].Value = "-"; } } for (int i = 1; i < dgvCommandes.ColumnCount - 5; i++) { if (dgvCommandes.Columns[i].HeaderText == requete[j].Designation) { dgvCommandes[i, ligne].Value = requete[j].QuantiteCmd; } } total += requete[j].MontantTot; } }
Je n’ai pas testé le code, mais normalement le changement de votre algorithme pour faire le remplissage par ligne devrait résoudre votre problème.
Un dernier aspect à revoir : il pourrait être nécessaire trier la liste obtenue par votre requête par le nom et prénom d’utilisateurs pour être sûr que les lignes spécifiques à chaque utilisateur sont consécutives dans votre liste.
Bonne journée,
Cipri
Ciprian DUDUIALA, MSFT  
•Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.
- Marqué comme réponse Hervino 14 lundi 3 octobre 2011 23:53
-
Merci bien Ciprian,
ça donne exactement ce que je recherchais. Mais là j'ai encore un petit problème, avec ce code on accède pas à la colonne total de la dernière ligne. jusque là j'ai essayer mais j'ai pas encore trouvé, je ne sais pas si vous pouvez revoir le code et me dire ce que je dois faire. entre temps moi je continu de chercher.
Merci beaucoup
-
Bonsoir,
Oui… ma faute… Après l’instruction for pour le variable j il faut insérer de nouveau la ligne :
dgvCommandes[dgvCommandes.ColumnCount - 5, ligne].Value = total;
et ca va résoudre votre problème. Plus précis :
for (int j = 0; j < requete.Count(); j++)
{
…
total += requete[j].MontantTot;
}
dgvCommandes[dgvCommandes.ColumnCount - 5, ligne].Value = total;
Cordialement,
Cipri
Ciprian DUDUIALA, MSFT  
•Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.
- Marqué comme réponse Hervino 14 lundi 3 octobre 2011 23:53
-
-