PrintDocument : HasMorePage ne fonctionne pas

Résolu
MGD Software Messages postés 186 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 23 avril 2022 - 15 avril 2019 à 13:53
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 - 16 avril 2019 à 14:04
Bonjour,

Malgré un très bonne expérience de l'impression en VB6, je me heurte à un problème basique pour mon premier essai en C#.
L'impression en elle-même ne pose pas de problème, j'arrive à gérer le positionnement et l'écriture des textes et des images sur la page.

Le problème survient lorsque j'arrive en bas de page. D'après la documentation et tout ce que j'ai trouvé sur le Web, il suffit d'affecter la valeur true à la propriété HasMorePage pour changer de page et rappeler l'évènement PrintPage.

Mais ça ne fonctionne pas, ni pour l'aperçu (toutes les pages se superposent) ni pour l'imprimante physique (seule la première page sort). J'ai vérifié à l'aide d'un point d'arrêt que je passe bien dans la ligne 16, et que la fonction n'est pas rappelée avec un autre point d'arrêt dans la ligne 6.

Ci-dessous, le code de ma fonction. Qu'est-ce que j'ai raté ?

private void PrtDoc_PrintPage(object sender, PrintPageEventArgs e)
{
    List<PrintLine> Printed = new List<PrintLine>();
    try
    {
        PageNum++;
        PrintHeader(e);     // Impression de l'entête de page

        PosY = e.PageSettings.Margins.Top;       // Position courante en Y

        foreach (PrintLine Line in Lines)
        {
            PrintOneLine(Line, e);              // Impression d'une ligne et incrémentation de PosY
            Printed.Add(Line);                  // Mémorisation de la ligne écrite
            if (PosY >= e.MarginBounds.Bottom)  // Fin de page atteinte
                e.HasMorePages = true;          // Changement de page
        }

        PrintFooter(e);      // Impression du pied de page

        // On retire de la liste des lignes celles qui viennent d'être imprimées
        foreach (PrintLine Line in Printed)
            Lines.Remove(Line);

        // Plus de lignes : terminé
        if (Lines.Count == 0)
            e.HasMorePages = false;
    }
    catch (Exception ex) { ErrorHandling.TraiteErreur(ex, "Page en cours : " + PageNum); NoErr = false; }
}

5 réponses

vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 15 avril 2019 à 14:59
Bonjour !
Pour une nouvelle page tu ne te repositionnes pas en haut de la page
A tester
 
if (PosY >= e.MarginBounds.Bottom)  // Fin de page atteinte
     e.HasMorePages = true;          // Changement de page


à remplacer par

if (PosY >= e.MarginBounds.Bottom)  // Fin de page atteinte
{
     e.HasMorePages = true;          // Changement de page
     PosY = e.PageSettings.Margins.Top;       // Position Y en haut de page
}

0
MGD Software Messages postés 186 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 23 avril 2022 2
15 avril 2019 à 16:09
Ça revient au même : en théorie, lorsqu’on fait HasMorePage = true, la la fonction PrintPage est rappelée. Or j'initialise PosY en entrée de cette fonction.

Dans le pire des cas, je devrais avoir des pages vides si PosY était en dehors de la page..
J’avais déjà essayé ta proposition : résultat, les différentes pages sont toutes imprimées sur la même feuille ! Ce qui prouve bien que PrintPage n'est pas rappelé lorsqu'on affecte true à HasMorePage, et qu'il n'y a pas de saut de page effectif, ni dans l’aperçu, ni dans l'imprimante physique.

Ce n'est donc pas la solution. Dommage.
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 15 avril 2019 à 21:51
Bonsoir !
Tu dis que la fonction PrintPage est rappelée lorsque HasMorePage = true
En étant logique cela réimprime une seconde fois les lignes de la première page qui elle est déjà imprimée et ainsi de suite.
Essaie ce code
Quand on attend la fin de page on fait un break pour sortir de la boucle for
On enlève de la collection les lignes déjà imprimées
Si l'impression n'est pas finie HasMorePages est true sinon elle est false
Si HasMorePages = true on imprime la page suivante


private void PrtDoc_PrintPage(object sender, PrintPageEventArgs e)
{
    List<PrintLine> Printed = new List<PrintLine>();
    try
    {
        PageNum++;
        PrintHeader(e);     // Impression de l'entête de page

        PosY = e.PageSettings.Margins.Top;       // Position courante en Y

        foreach (PrintLine Line in Lines)
        {
            PrintOneLine(Line, e);              // Impression d'une ligne et incrémentation de PosY
            Printed.Add(Line);                  // Mémorisation de la ligne écrite
            if (PosY >= e.MarginBounds.Bottom)  // Fin de page atteinte
                break; // fin de page
        }

        PrintFooter(e);      // Impression du pied de page

        // On retire de la liste des lignes celles qui viennent d'être imprimées
        foreach (PrintLine Line in Printed)
            Lines.Remove(Line);

        // Reste-t-il des lignes pour une page suivante à imprimer 
        e.HasMorePages = (Lines.Count > 0); // si oui HasMorePages = true
    }
    catch (Exception ex) { ErrorHandling.TraiteErreur(ex, "Page en cours : " + PageNum); NoErr = false; }
}


0
MGD Software Messages postés 186 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 23 avril 2022 2
16 avril 2019 à 14:00
Yes !
Ça marche.

J'en déduis une chose essentielle pour la gestion des pages : HasMorePages doit être la dernière instruction de la procédure PrintPage.

En y réfléchissant, c'est effectivement normal puisque cette affectation est supposée provoquer, dans le cas d'une valeur true, l'insertion d'un saut de page dans le flux de sortie imprimante et un rappel de la même fonction. Je suppose que continuer à exécuter du code après cette instruction annule son effet.

Merci VB95.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
16 avril 2019 à 14:04
Bonjour !
Bien heureux que cela fonctionne correctement !
A +
0
Rejoignez-nous