Partage
  • Partager sur Facebook
  • Partager sur Twitter

Pas d'affichage de valeurs dans un DataGridView

Effacement des cellules de la ligne précédente lors d'ajout de lignes

    30 octobre 2019 à 12:52:08

    Bonjour

    J’ai un souci d’affichage des valeurs de cellules d’un DataGridView lors du remplissage de celle-ci.

    Au départ ces valeurs se trouvent dans un fichier texte.

    Pour ce qui est de les ramener dans le programme, pas de problème. Je récupère la centaine de lignes enregistrées dans le fichier texte et pour les travailler, je me sers d’un foreach quant à ce qui concerne les lignes, puis d’un for pour le 13 valeurs (13 colonnes) séparées par une barre verticale. Enfin je me sers d’un switch pour placer les valeurs dans les bonnes cellules du DGV. L’ordre des enregistrements des données n’est pas tout à fait le même que celui de l’affichage de ces données ; d’où le switch. En faisant un « brekpoint » (F9) et en suivant le code ligne par ligne (F11) tout va bien. Chaque valeur se place au bon endroit, chaque ligne est implémentée sauf que… le résultat est qu’il n’y a que la dernière ligne qui est affichée. Toutes les lignes sont bien là, ajoutées dans le tableau, mais vides. Seule la dernière ligne est bien affichée des valeurs voulues.

    Je pense que j’ai dû monter cela tel l’amateur apprenti que je suis et que quelque chose m’a échappé. J’ai beau chercher sur le Net, je ne trouve pas mon problème. Ce sont je pense mes critères de recherche qui ne sont pas bon, mais je ne sais plus trop comment exprimer mon problème. J’ai téléchargé des PDF sur le DGV et le langage C#, j’ai appris plein de choses, mais rien qui ne concerne mon souci.

    Je remercie ceux ou celles qui auront la bonté de se pencher quelques instants sur mon embarras et de m’éclairer si possible.

    Le programme donne quelque chose comme ceci .

    foreach (var ligneEnCour in lignesDuFichier)
    {
    string[] lesCellules = ligneEnCour.Split('|');
       for (I = 0; I < 13; I++)
       {
    switch (I)
    {
    Case 0 :
    DGV_AjouterFacture[I, compteur_1 ].Value = lesCellules[0];}
    Break ; //etc…
       }
    Compteur_1 ++ ;
    }
    
    • Partager sur Facebook
    • Partager sur Twitter
      30 octobre 2019 à 14:01:15

      Vous les ajoutez où vos lignes de donnés (dans quelle ligne de code source) ?

      Franchement, vous faites un très gros bricolage bien complexe pour un truc qui ce fait en 2 lignes en utilisant les bon outils, comme l'utilisation d'un DataSet comme DataSource de votre DataGridView:

      https://docs.microsoft.com/fr-fr/dotnet/api/system.windows.forms.datagridview.datasource?view=netframework-4.8

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        30 octobre 2019 à 18:51:45

        Bonsoir

        Merci de vous intéresser à mon petit problème et pour le lien. Je n'ai encore jamais travaillé avec le "datasource" j'ai vu ça sur les PDF téléchargés. je le regarderais plus en détail pour une autre fenêtre que je dois faire et qui utilise un datagridview elle aussi.

        Je fais un gros bricolage sûrement mais comme je l'ai exprimé je suis un apprenti amateur et j'apprends sur le tas. (bien obligé)

        la solution du foreach pour récupérer les lignes, du for pour récupérer les valeurs des cellules et du switch pour les afficher au bon endroit parce que l'ordre de l'affichage n'est pas le même que celui des enregistrements du fichier, me paraissait, à mon niveau, pas si mal "si elle fonctionnait".

        j'adapte un petit programme avec un fichier existant qui lui ne peut être changé puisque c'est un fichier dont l'on se sert en entreprise et dont l'enregistrement se passe ailleurs.

        (Vous les ajoutez où vos lignes de donnés (dans quelle ligne de code source) ?)

        Ici dans mon dataGridView qui se nomme "DGV_DatraGridView"

        switch (I)
        {
        Case 0 :
        DGV_AjouterFacture[I, compteur_1 ].Value = lesCellules[0];}
        Break ; //etc…

        -
        Edité par HervéJoos 30 octobre 2019 à 18:53:47

        • Partager sur Facebook
        • Partager sur Twitter
          31 octobre 2019 à 11:34:24

          Bon, bin, vous apprendrez à la dure, et j'espère que vous lirez attentivement les possibilités des DataSource/DataSet et aussi des DataView qui permettent, entre autre, la customisation de l'affichage, en changeant l'ordre "d'apparition".

          J'insiste, avec ces outils, vous ferez en 2/3 lignes de code très claires, tous les bidules que vous tentez de faire avec plusieurs dizaines de lignes de code très peu lisibles que vous essayez de bricoler.

          >Ici dans mon dataGridView qui se nomme "DGV_DatraGridView"

          Dans l'extrait de code, à aucun moment il y a un "DGV_DatraGridView", est-ce plutôt "DGV_AjouterFacture" ?

          Si c'est le cas, il manque clairement des parties extrêmement importantes dans l'extrait que vous nous donnez : la détermination du nombre de ligne, etc...

          Sinon, il faut que vous nous donniez l'implémentation des choses que vous utilisez, comme "DGV_AjouterFacture", etc...

          Votre code, qui utilise des variables "couplées", comme "I" et "Compteur-1" (faites gaffe au nommage des variables, ici, c'est vraiment une caricature de ce qu'il ne faut pas faire : non respect des conventions de nommage et noms vide de toute signification) est complexe et votre extrait de code ne permet pas de voir si cela est justifié.

          Expliquez votre besoin initial (ordre dans le fichier = ordre à l'affichage et le pourquoi de cet ordre), pour qu'on puisse vous donnez une manière de faire moins casse-gueule.

          Donnez-nous tout le code significatif au problème (s'il y en a beaucoup, c'est qu'il y a un gros problème de conception), et, si possible, des copies d'écran.

          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            31 octobre 2019 à 11:59:20

            Bonjour

            J’ai trouvé la solution à mon petit problème

            Celui-ci était que lors de l’implémentation des valeurs de cellules dans un DataGridView, celles-ci ne s’affichaient pas.

            Mes lignes de données sont dans un fichier texte. Je les récupère, puis avec « foreach » je les travaille une à une.

            foreach (var ligneEnCour in lignesDuFichier){}

            Chaque « ligneEnCours » contient 13 données (13 colonnes) séparées par une barre verticale. Je les récupère en me servant de la fonction « Split »

            string[] lesCellules = ligneEnCour.Split('|');

            puis je place dans les bonnes cellules du DGV le contenu de cellules[] en me servant d’un « For » et d’un « Switch »

            for (I = 0; I < 13; I++)

            {}

            switch (I){

            case 0:

            //Ici le placement des données dans les bonnes cellules du DGV

            DGV_AjouterFacture[I, compteur_1].Value = lesCellules[0];

            break;

            En fin du « foreach » j’ai placé un compteur de lignes « compteur_1 »

            compteur_1++;

            Suivi d’un ajout de ligne

            DGV_AjouterFacture.Rows.Add();

            Tout cela au résultat n’affichait que les lignes ajoutées mais vides de toutes données sauf la toute dernière qui elle affichait bien ce qui lui avait été implanté lors de la marche du programme.

            La solution du problème se trouve justement dans cette dernière ligne. Ici le programme fait bien ce qu’on lui demande de faire, c'est-à-dire de rajouter des lignes… mais vides. Alors que si on ajoute le numéro de ligne au rajout de ligne… de la manière ci-dessous

            DGV_AjouterFacture.Rows.Add(compteur_1);

            Tout s’affiche correctement. voici le petit bout de code

            foreach (var ligneEnCour in lignesDuFichier)
            {
             string[] lesCellules = ligneEnCour.Split('|');
             if (compteur_1 >= 1)
             {
               DGV_AjouterFacture.Rows.Add(compteur_1);//Ajoute une ligne avec son numéro
             }//Fin du If
             for (I = 0; I < 13; I++)
             {
             switch (I)
              {
               case 0:
                DGV_AjouterFacture[I, compteur_1 ].Value = lesCellules[0];
                break;
              }//Fin du switch
             }//Fin du For
             Compteur_1++; //Compteur ligne qui s’incrémente
            }//Fin du foreach
            

            Je m’excuse pour cette fastidieuse explication, mais quand je recherche une solution à l’un des nombreux problèmes qui se trouvent sur mon chemin de « programmeur » très amateur, et que je trouve finalement quelqu’un qui a eu le même souci, il est particulièrement décevant de voir "sujet résolu" sans que la solution du problème ne soit affichée. Je sais bien que je bidouille et que ce petit bout de code n’est pas parfait, mais il fonctionne et me permet d’avancer. Si jamais il peut servir à un autre bidouilleur…

            Merci à tous pour ce temps de lecture.

            Bonjour Bacelar

            Pardon, je n'ai vu votre post qu'après avoir posé le mien car dans le temps de la composition de celui-ci vous avez été plus rapide que moi.

            Promis je regarde les DGV et la bonne manière de s'en servir. 

            Si c'est le cas, il manque clairement des parties extrêmement importantes dans l'extrait que vous nous donnez : la détermination du nombre de ligne, etc...

            Sinon, il faut que vous nous donniez l'implémentation des choses que vous utilisez, comme "DGV_AjouterFacture", etc...

            Votre code, qui utilise des variables "couplées", comme "I" et "Compteur-1" (faites gaffe au nommage des variables, ici, c'est vraiment une caricature de ce qu'il ne faut pas faire : non respect des conventions de nommage et noms vide de toute signification) est complexe et votre extrait de code ne permet pas de voir si cela est justifié.

             Le DataGridView est créé dynamiquement, le nombre de ligne est défini lors de la lecture du fichier txt, en fait si je vous donne tout le code, vous seriez surpris de voir le nombre de lignes explicatives au moindre bout de code que je mets. Je dirais que pour trois mots de code il y a quelques lignes explicatives du pourquoi et du résultat, de même avant chaque procédure (void) il y a l'explication du pourquoi de la procédure. Le "I" critiqué à son explication dans la description de la procédure, de même que "compteur_1". Ce "I" et ce "compteur_1" une fois la procédure parfaitement fonctionnelle auront des noms plus spécifiques, genre "lesColonnes" et "lesLignes" afin de pourvoir resservir si besoin est dans un futur projet. Comme je suis en mode conception-création, ce code est pour moi et comme expliqué détaillé avant la procédure en cours. 

            Toutes ces lignes explicatives dans mon code, c'est ma manière non seulement d'apprendre en m'expliquant ce que je fais, mais aussi de rappel si ma mémoire me fait défaut. Le travail de programmeur du dimanche m'est utile pour me faciliter bien des tâches en rapport avec mon travail mais il n'est pas celui de premier plan, loin de là, bien qu'il soit plaisant de se triturer la tête à essayer de créer des bout de programmes et tout de même un peu gratifiant quand ça marche..  

            merci pour votre intérêt à mon post et bonne continuation.

            -
            Edité par HervéJoos 31 octobre 2019 à 12:33:44

            • Partager sur Facebook
            • Partager sur Twitter
              31 octobre 2019 à 17:50:59

              Je vous ai demandé le "pourquoi", pas le comment, je sais lire le code C#. ;)

              Donc, ma question :

              >Vous les ajoutez où vos lignes de donnés (dans quelle ligne de code source) ?

              C'est

              >DGV_AjouterFacture.Rows.Add();

              Et pas autre chose.

              Effectivement, vous l'ajoutez vide et je ne comprends pas pourquoi vous ne l'ajouter pas directement rempli avec un simple :

              DGV_AjouterFacture.Rows.Add(lesCellules);


              Donc pas de "For" ou de "Switch" tout moisi don vous n'expliquez toujours pas leur fonction.

              En plus, vous semblez utiliser une bidouille sur le cas ou "compteur_1" est égale à 0, vraisemblablement une ligne déjà créé par le Designer.

              Pourquoi faire un code "verrue" qui ne fonctionne correctement dans ce cas tout foireux ?

              Supprimer préventivement toutes les lignes de votre DataGridView préventivement. Cela permettra de gérer facilement le rafraichissement des données sans vous prendre la tête.


              >sauf la toute dernière qui elle affichait bien ce qui lui avait été implanté lors de la marche du programme.

              Pouvez-vous être plus clair. C'est incompréhensible.


              >La solution du problème se trouve justement dans cette dernière ligne.

              Non, vous avez une très mauvaise approche. Ne commencez par faire des hypothèses et essayer des trucs pour "contrer" cette hypothèse.

              Vérifiez d'abord qu'elle est exacte (et moi, j'ai même pas besoin de vérifier car elle ne colle absolument pas à ce que fait votre code).

              Commencez par voir comment se comporte votre programme avec le débogueur. Si vous voulez jouer à Nostradamus avec moi, moi, je paris que "lesCellules[0]" est toujours vide sauf pour la dernière ligne car le fichier ne correspond pas au format que vous attendez sauf sur la dernière ligne.

              Votre code ne travaille que sur la 0ième colonne. Si vous utilisiez toutes les colonnes, je pense que vous verriez un décalage.

              Donc pour résumer, je pense que votre code serait plus flexible et compréhensible ainsi:

              DGV_AjouterFacture.Rows.Clear();
              
              foreach (var ligneEnCour in lignesDuFichier)
              {
                 string[] lesCellules = ligneEnCour.Split('|');
              
                 /* faire les bidouilles sur "lesCellules"*/
              
                 DGV_AjouterFacture.Rows.Add(lesCellules);
              
              }



              Le bug doit toujours y être mais le débogueur vous indiquera où ça déconne en mettant un point d'arrêt dans la zone où j'ai mis un commentaire.


              EDIT: Le Post "réponse" de @HervéJoos dont ce post est la réponse semble avoir disparu.

              -
              Edité par bacelar 31 octobre 2019 à 17:54:04

              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                1 novembre 2019 à 17:01:00

                bacelar a écrit:

                EDIT: Le Post "réponse" de @HervéJoos dont ce post est la réponse semble avoir disparu.

                Bonjour, je viens de sortir son message des spams.



                • Partager sur Facebook
                • Partager sur Twitter
                  2 novembre 2019 à 16:48:37

                  Bonjour je me demandais ou était parti mon message...

                  Merci Bacelar pour votre réponse... je récupère le bout de code que vous me proposez mais finalement, je laisse tomber ce que vous appelez bidouillage, et qui l'est sûrement, bien qu'il m'affiche ce que je veux maintenant (parce que j'avais fini par trouver la solution à mon souci), et je me suis plongé depuis ce matin dans une autre manière de faire la même chose mais en écoutant les sages du codage C# (vous en l’occurrence). 

                  Franchement, vous faites un très gros bricolage bien complexe pour un truc qui ce fait en 2 lignes en utilisant les bon outils, comme l'utilisation d'un DataSet comme DataSource de votre DataGridView:

                  Je me suis servi du fichier txt pour remplir la base de donnée créée pour l'occasion, j'ai réussi la connexion à partir du code en C# (ça marche) puis comme vous le préconisez je me sers d'un dataset comme datasource du DGV... Bon j'en suis là et je continue sur le chemin de la connaissance de ce qui concerne le manipulage de données...

                  Merci pour votre attention et votre intérêt.

                  -
                  Edité par HervéJoos 2 novembre 2019 à 16:50:31

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Pas d'affichage de valeurs dans un DataGridView

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown