none
Remplissage datagridview RRS feed

  • 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
    mercredi 28 septembre 2011 00:50

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


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    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
    lundi 3 octobre 2011 09:35
  • 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


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    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
    lundi 3 octobre 2011 19: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
    mercredi 28 septembre 2011 08:54
    Modérateur
  • 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
    mercredi 28 septembre 2011 09:51
    Auteur de réponse
  • 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


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    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.

    vendredi 30 septembre 2011 06:46
  • 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.

    vendredi 30 septembre 2011 22:33
  • 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


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    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.

    lundi 3 octobre 2011 07:31
  • 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
    lundi 3 octobre 2011 08:50
  • 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


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    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
    lundi 3 octobre 2011 09:35
  • 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

    lundi 3 octobre 2011 17:03
  • 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


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    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
    lundi 3 octobre 2011 19:53
  • Merci Ciprian,

    ça marche à merveille.

    A la prochaine.

    lundi 3 octobre 2011 23:49
  • Je crois qu'avec SS Reporting Services ,c'est plus facile ce genre de truc mais bon, ça reste encore un choix.Bonne journée à tous !! 
    EJAY,Developpeur C#
    mardi 4 octobre 2011 08:36