PrintDocument : HasMorePage ne fonctionne pas [Résolu]

Messages postés
142
Date d'inscription
vendredi 1 septembre 2006
Statut
Membre
Dernière intervention
25 mai 2019
- - Dernière réponse : vb95
Messages postés
1886
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 juin 2019
- 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; }
}
Afficher la suite 

5 réponses

Messages postés
1886
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 juin 2019
60
0
Merci
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
}

Commenter la réponse de vb95
Messages postés
142
Date d'inscription
vendredi 1 septembre 2006
Statut
Membre
Dernière intervention
25 mai 2019
0
Merci
Ç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.
Commenter la réponse de MGD Software
Messages postés
1886
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 juin 2019
60
0
Merci
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; }
}


Commenter la réponse de vb95
Messages postés
142
Date d'inscription
vendredi 1 septembre 2006
Statut
Membre
Dernière intervention
25 mai 2019
0
Merci
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.
Commenter la réponse de MGD Software
Messages postés
1886
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 juin 2019
60
0
Merci
Bonjour !
Bien heureux que cela fonctionne correctement !
A +
Commenter la réponse de vb95