Partage
  • Partager sur Facebook
  • Partager sur Twitter

Impression d'un document pdf avec Plus d'une page

Printdocument C#

Sujet résolu
    20 avril 2021 à 18:29:56

    Bonjour j'ai un soucis en CSharp sur l'impression avec printdocument 

    je désire imprimer un bulletin de paie pour chaque agent se trouvant dans la base de données j'ai déjà récupéré et parcouru chaque agent mais je veux imprimer une page par agent grâce à la boucle toujours dans le même document mais mon code les superpose sur la même page 

    merci d'avance pour votre aide.

     private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
            {
                string matricule;
                string code_grade;
                string code_Aff;
                int nbrenfants;
                int primeDiplome;
                int salaire;
                int indeminite;
                int allocation;
                string grade;
                string affectation;
                string nom;
                string postnom;
                string prenom;
                int totals = 0;
                int generalep = int.Parse(gunaTextBox1.Text);
                int ajustement = int.Parse(gunaTextBox3.Text);
                int taux = int.Parse(gunaTextBox2.Text);
    
                try
                {
                    cmd = connect.PaieA();
                    MySqlDataReader d;
                    d = cmd.ExecuteReader();
                    e.Graphics.DrawString("Bulletin De Paie", new Font("Century Gothic", 25, FontStyle.Bold), Brushes.Black, new Point(230));
                    while (d.Read())
                    {
    
                        matricule = d.GetValue(2).ToString();
                        code_grade = d.GetValue(3).ToString();
                        code_Aff = d.GetValue(4).ToString();
                        nbrenfants = int.Parse(d.GetValue(6).ToString());
                        primeDiplome = int.Parse(d.GetValue(7).ToString());
                        salaire = int.Parse(d.GetValue(8).ToString());
                        indeminite = int.Parse(d.GetValue(9).ToString());
                        allocation = int.Parse(d.GetValue(10).ToString());
                        grade = d.GetValue(11).ToString();
                        affectation = d.GetValue(12).ToString();
                        nom = d.GetValue(13).ToString();
                        postnom = d.GetValue(14).ToString();
                        prenom = d.GetValue(15).ToString();
                        totals += salaire + primeDiplome + indeminite + (allocation * nbrenfants) + generalep + ajustement;
    
    
                        e.Graphics.DrawString(nom+" "+ postnom+ " "+ prenom, new Font("Century Gothic", 25, FontStyle.Bold), Brushes.Black, new Point(70, 150)); 
                        e.Graphics.DrawString(totals.ToString(), new Font("Century Gothic", 25, FontStyle.Bold), Brushes.Black, new Point(100,200));
                        e.HasMorePages = true;
                        e.HasMorePages = false;
    
                    }
                    
                    d.Close();
    
    
                }
                catch (Exception)
                {
                    fail.Fail_text("Echec une erreur est survenu");
                    fail.ShowDialog();
                }

    -
    Edité par Zibu9 20 avril 2021 à 19:33:07

    • Partager sur Facebook
    • Partager sur Twitter
      20 avril 2021 à 18:58:14

      printpage est appelé pour imprimer une page, et sera rappelé si HasMorePages est à true; dans ton code, tu le passes à true, puis à false, donc il vaut false et ne relance pas la fonction.

      il faut que tu sortes la récupération des données de la fonction, que ta fonction est accès à ton datareader d et que tu testes d.Read() pour mettre e.HasMorePages à true si d.Read() renvoie vrai (e.HasMorePages=d.Read() pour faire simple)

      L'exemple de la doc officielle pour afficher un fichier texte multipage : https://docs.microsoft.com/fr-fr/dotnet/desktop/winforms/advanced/how-to-print-a-multi-page-text-file-in-windows-forms 

      • Partager sur Facebook
      • Partager sur Twitter
        21 avril 2021 à 3:55:05

        le problème est qu'on doit parcourir tout les enregistrement, si je sors la récupération dans la fonction il n'y aura pas parcourt des autres enregistrement🤔

        sinon j'ai mis e.HasMorePages=d.Read()

        mais toujours pas de nouvelle page

        tout les enregistrement sont superposés sur la même ligne 

        -
        Edité par Zibu9 21 avril 2021 à 4:04:46

        • Partager sur Facebook
        • Partager sur Twitter
          21 avril 2021 à 11:30:56

          le fait de lancer d.Read() fait que tu lis l'enregistrement suivant, donc en sortant la récupération de cette fonction (tu la mets dans une fonction "intermédiaire" qui va lancer l'impression), puis appelant l'impression derrière,  la fonction va parcourir ton data reader jusqu'à la fin.

          Regarde l'exemple que j'ai donné: on lit le fichier en entier dans la variable stringToPrint dans une fonction ReadFile(); Puis dans la fonction d'impression, on met un certain nombre de caractères de cette variable sur la page, on retire les caractères imprimés de cette variable; on teste la longueur de la chaine restante pour donner la valeur à e.HasMorePages (e.HasMorePages = (stringtoPrint >0); ) => si il reste des caractères, on met true, false chaine vide. et rien de plus. et la fonction d'impression est appelé lors du clic d'un bouton.

          Dans ton cas, tu as sûrement pareil un bouton pour déclencher l'impression, donc dans celui-ci tu fais ta requête, et tu appelles l'impression:

          private void printButton_Click(object sender, EventArgs e)
                  {
                     cmd = connect.PaieA();
                     MySqlDataReader d;
                     d = cmd.ExecuteReader();
                     printDocument1.Print();
                     d.Close();
                  }
          private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
                 {
                     string matricule;
                     string code_grade;
                     string code_Aff;
                     int nbrenfants;
                     int primeDiplome;
                     int salaire;
                     int indeminite;
                     int allocation;
                     string grade;
                     string affectation;
                     string nom;
                     string postnom;
                     string prenom;
                     int totals = 0;
                     int generalep = int.Parse(gunaTextBox1.Text);
                     int ajustement = int.Parse(gunaTextBox3.Text);
                     int taux = int.Parse(gunaTextBox2.Text);
                      
                     e.Graphics.DrawString("Bulletin De Paie", new Font("Century Gothic", 25, FontStyle.Bold), Brushes.Black, new Point(230));
           
                      matricule = d.GetValue(2).ToString();
                      code_grade = d.GetValue(3).ToString();
                      code_Aff = d.GetValue(4).ToString();
                      nbrenfants = int.Parse(d.GetValue(6).ToString());
                      primeDiplome = int.Parse(d.GetValue(7).ToString());
                      salaire = int.Parse(d.GetValue(8).ToString());
                      indeminite = int.Parse(d.GetValue(9).ToString());
                      allocation = int.Parse(d.GetValue(10).ToString());
                      grade = d.GetValue(11).ToString();
                      affectation = d.GetValue(12).ToString();
                      nom = d.GetValue(13).ToString();
                      postnom = d.GetValue(14).ToString();
                      prenom = d.GetValue(15).ToString();
                      totals += salaire + primeDiplome + indeminite + (allocation * nbrenfants) + generalep + ajustement;
           
                      e.Graphics.DrawString(nom+" "+ postnom+ " "+ prenom, new Font("Century Gothic", 25, FontStyle.Bold), Brushes.Black, new Point(70, 150));
                             
                      e.Graphics.DrawString(totals.ToString(), new Font("Century Gothic", 25, FontStyle.Bold), Brushes.Black, new Point(100,200));
          
                      e.HasMorePages = d.Read();
                  }
          



          -
          Edité par umfred 21 avril 2021 à 11:31:15

          • Partager sur Facebook
          • Partager sur Twitter
            21 avril 2021 à 11:51:12

            ça n'affiche qu'un seul enregistrement le dernier j'avais déjà essaye ça
            • Partager sur Facebook
            • Partager sur Twitter
              21 avril 2021 à 13:22:19

              en fait, ça vient de la nature du DataReader ... il faudrait passer par un DataSet/DataTable/DataAdapter ou en créant une classe correspondant à ce que tu veux afficher et dont tu créées une nouvelle instance à chaque passage dans la fonction.

              Peut-être en t'inspirant de https://stackoverflow.com/questions/38651038/how-to-store-value-of-sqldatareader-in-a-listclass 

              • Partager sur Facebook
              • Partager sur Twitter
                22 avril 2021 à 14:34:02

                d'accord je vois je vais essayer merci beaucoup
                • Partager sur Facebook
                • Partager sur Twitter

                Impression d'un document pdf avec Plus d'une page

                × 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