IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Ajouter un titre à l'impression


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mai 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Âge : 71

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 304
    Par défaut Ajouter un titre à l'impression
    Bonjour
    J'imprime le contenu d'une listView grâce au code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
            'Declaration d'une variable "statique" pour pouvoir parcourir le listView en cas des plusieurs pages
            Static pos As Int32 = 0
            Dim HauteurTexte As Single = e.Graphics.MeasureString("X", Me.ListView1.Font).Height 'Recuperation d'hauteur du texte
            Dim LignePerPage As Int32 = CInt(e.MarginBounds.Height / HauteurTexte) 'Calcul de nombre des lignes par page
            Dim XPos, YPos As Single 'Les positions temporaires
            YPos = HauteurTexte
            XPos = 0
            'Imprime la liste
            For cmptLig As Int32 = 0 To ListView1.Items.Count - 1
                If cmptLig > LignePerPage Then
                    YPos = 0
                    e.HasMorePages = True
                    Exit For
                ElseIf pos > ListView1.Items.Count - 1 Then
                    'travail termine
                    e.HasMorePages = False
                    pos = 0
                    Exit For
                End If
                For clm As Int32 = 0 To ListView1.Columns.Count - 1
                    e.Graphics.DrawString(ListView1.Items(pos).SubItems(clm).Text, ListView1.Font, Brushes.Black, XPos, YPos) ' New Font("Arial", 15, FontStyle.Regular)
                    XPos += ListView1.Columns(clm).Width 'la position horisontale
                Next
                YPos += HauteurTexte
                XPos = 0
                pos += 1
            Next
            If e.HasMorePages = False Then pos = 0 'Si il n'y a que une page on met la variable statique a 0
        End Sub
     
        Private Sub Btnprint_Click(ByVal sender As Object, ByVal e As EventArgs) Handles BtnPrint.Click
            PrintDocument1.DocumentName = "Acteurs sans photo"
            PrintDocument1.DefaultPageSettings.Margins = New Margins(50, 10, 50, 50) 'definir les marges
            PrintDocument1.OriginAtMargins = True 'appliquer les marges définies
            PrintDocument1.DefaultPageSettings.Landscape = False 'mode portret
            PrintPreviewDialog1.Document = PrintDocument1 'Chargement du document dans l'apperçu
            PrintPreviewDialog1.WindowState = FormWindowState.Maximized
            PrintPreviewDialog1.ShowDialog() 'Affichage du dialogue
        End Sub
    Tout fonctionne bien, j'ai la page en prévisu ( en plein écran )
    Mais voilà je voudrais ajouter une en-tête à cette page
    Je n'ai pas trouvé de solution ...
    Merci pour votre aide

  2. #2
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour,

    Si tu veux un titre seulement sur la première page, tu peux utiliser la variable pos comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ' Avant l'impression de contenu :
            For cmptLig As Int32 = 0 To ListView1.Items.Count - 1
     
    If pos = 0 Then
     '  j'imprime le titre ici
    End If
     ' ... ... ...
    Si tu veux un entête qui revient à chaque page, tu peux initialiser à True une nouvelle variable Static et Boolean (NouvellePage), la mettre à False après l'impression de l'entête et la remette à True chaque fois que tu fais HasMorePage = True.

    Cela devrait donner ± ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
     Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
            'Declaration d'une variable "statique" pour pouvoir parcourir le listView en cas des plusieurs pages
            Static pos As Int32 = 0
    Static NouvellePage As Boolean = True
            Dim HauteurTexte As Single = e.Graphics.MeasureString("X", Me.ListView1.Font).Height 'Recuperation d'hauteur du texte
            Dim LignePerPage As Int32 = CInt(e.MarginBounds.Height / HauteurTexte) 'Calcul de nombre des lignes par page
            Dim XPos, YPos As Single 'Les positions temporaires
            YPos = HauteurTexte
            XPos = 0
            'Imprime la liste
            For cmptLig As Int32 = 0 To ListView1.Items.Count - 1
     
    If NouvellePage Then
    ' j'imprime l'entête
     NouvellePage = False
    End if
     
                If cmptLig > LignePerPage Then
                    YPos = 0
                    e.HasMorePages = True
     
    NouvellePage = True
     
                    Exit For
                ElseIf pos > ListView1.Items.Count - 1 Then
                    'travail termine
                    e.HasMorePages = False
                    pos = 0
                    Exit For
                End If
     
                For clm As Int32 = 0 To ListView1.Columns.Count - 1
                    e.Graphics.DrawString(ListView1.Items(pos).SubItems(clm).Text, ListView1.Font, Brushes.Black, XPos, YPos) ' New Font("Arial", 15, FontStyle.Regular)
                    XPos += ListView1.Columns(clm).Width 'la position horisontale
                Next
                YPos += HauteurTexte
                XPos = 0
                pos += 1
            Next
            If e.HasMorePages = False Then pos = 0 'Si il n'y a que une page on met la variable statique a 0
        End Sub
    J'espère que ceci t'inspirera ...

  3. #3
    Membre éclairé
    Inscrit en
    Mai 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Âge : 71

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 304
    Par défaut
    Bonjour
    Merci pour ces explications, mais je n'ai pas compris où il faut définir l'en-tête ou le titre
    D'autre part j'avais une autre question : peut-on imprimer les en-têtes de colonnes ?
    Merci d'avance

  4. #4
    Membre éclairé
    Inscrit en
    Mai 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Âge : 71

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 304
    Par défaut
    J'ai réussi !!
    J'ai bien le titre sur toutes mes pages

    Mais je n'ai rien trouvé pour imprimer les en-têtes de colonnes

  5. #5
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bravo !!!

    Pour ce qui est des entêtes de colonnes, le texte d'un colonne est accessible par la propriété Text de la colonne.
    Par exemple, la boucle suivante affiche le texte d'entête de chaque colonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            For C As Integer = 0 To ListView1.Columns.Count - 1
                MessageBox.Show(ListView1.Columns(C).Text)
            Next
    Ceci devrait te mettre sur la piste ...


  6. #6
    Membre éclairé
    Inscrit en
    Mai 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Âge : 71

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 304
    Par défaut
    J'ai bien compris le principe
    Voilà mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For C As Integer = 0 To ListView1.Columns.Count - 1
                Entete = ListView1.Columns(C).Text
                e.Graphics.DrawString(Entete, printFont, System.Drawing.Brushes.Black, 0, 0)
            Next
    Je vois bien les en-têtes de colonnes sauf qu'elles commencent toutes au même endroit et que c'est illisible !!

    Autre problème, si je clique sur mes en-têtes de colonnes pour faire un tri, je n'ai plus de titre sur ma première page mais bien sur toutes les autres


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
            Dim text As String = "                                               Impression listView"
            Dim Entete As String
            Dim printFont As New System.Drawing.Font("Comic sans MS", 10, System.Drawing.FontStyle.Bold)
     
            'Declaration d'une variable "statique" pour pouvoir parcourir le listView en cas des plusieurs pages
            Static pos As Int32 = 0
            Static NouvellePage As Boolean = True
            Dim HauteurTexte As Single = e.Graphics.MeasureString("X", Me.ListView1.Font).Height 'Recuperation d'hauteur du texte
            Dim LignePerPage As Int32 = CInt(e.MarginBounds.Height / HauteurTexte) 'Calcul de nombre des lignes par page
            Dim XPos, YPos As Single 'Les positions temporaires
            YPos = 20 'HauteurTexte
            XPos = 0
            'Imprime la liste
     
     
     
            For C As Integer = 0 To ListView1.Columns.Count - 1
                Entete = ListView1.Columns(C).Text
                e.Graphics.DrawString(Entete, printFont, System.Drawing.Brushes.Black, 0, 0)
            Next
            For cmptLig As Int32 = 0 To ListView1.Items.Count - 1
     
                If NouvellePage Then
                    'imprime en-tête
                    e.Graphics.DrawString(text, printFont, System.Drawing.Brushes.Black, 0, 0)
                    NouvellePage = False
                End If
     
                If cmptLig > LignePerPage Then
                    YPos = 0
                    e.HasMorePages = True
                    NouvellePage = True
                    Exit For
                ElseIf pos > ListView1.Items.Count - 1 Then
                    'travail termine
                    e.HasMorePages = False
                    pos = 0
                    Exit For
                End If
                For clm As Int32 = 0 To ListView1.Columns.Count - 1
                    e.Graphics.DrawString(ListView1.Items(pos).SubItems(clm).Text, ListView1.Font, Brushes.Black, XPos, YPos) ' New Font("Arial", 15, FontStyle.Regular)
                    XPos += ListView1.Columns(clm).Width 'la position horisontale
                Next
                YPos += HauteurTexte
                XPos = 0
                pos += 1
            Next
            If e.HasMorePages = False Then pos = 0 'Si il n'y a que une page on met la variable statique a 0
        End Sub

  7. #7
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Je crois que le mieux serait de créer une chaîne contenant les entêtes pour les imprimer en une seule opération plutôt que dans une boucle. C'est un travail qui demande beaucoup de patience...
    Pour l'effet du tri sur l'mpression, ce sera à régler plus tard, si c'est toujours nécessaire.

  8. #8
    Membre éclairé
    Inscrit en
    Mai 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Âge : 71

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 304
    Par défaut
    Bonjour
    En créant une chaîne ça marche très bien
    En jouant sur les marges et sur les différents YPos j'ai bien mon titre, puis un peu en-dessous mes en-têtes de colonnes puis mes données
    C'est vraiment pas mal
    Il reste ce problème :
    Pour l'effet du tri sur l'impression, ce sera à régler plus tard, si c'est toujours nécessaire.
    Je te mets le code final

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
            Dim text As String = "                              Acteurs et actrices sans photo"
            Dim Entete As String
            Dim printFont As New System.Drawing.Font("Comic sans MS", 10, System.Drawing.FontStyle.Bold)
     
            'Declaration d'une variable "statique" pour pouvoir parcourir le listView en cas des plusieurs pages
            Static pos As Int32 = 0
            Static NouvellePage As Boolean = True
            Dim HauteurTexte As Single = e.Graphics.MeasureString("X", Me.ListView1.Font).Height 'Recuperation d'hauteur du texte
            Dim LignePerPage As Int32 = CInt(e.MarginBounds.Height / HauteurTexte) 'Calcul de nombre des lignes par page
            Dim XPos, YPos As Single 'Les positions temporaires
            YPos = 50 'HauteurTexte
            XPos = 0
            'Imprime la liste
     
     
     
            'For C As Integer = 0 To ListView1.Columns.Count - 1
            'Entete = ListView1.Columns(C).Text
            'e.Graphics.DrawString(Entete, printFont, System.Drawing.Brushes.Black, 0, 0)
            'Next
     
            Entete = " " & ListView1.Columns(0).Text & "   " & ListView1.Columns(1).Text
            e.Graphics.DrawString(Entete, printFont, System.Drawing.Brushes.Black, 0, 20)
     
            For cmptLig As Int32 = 0 To ListView1.Items.Count - 1
     
                If NouvellePage Then
                    'imprime en-tête
                    e.Graphics.DrawString(text, printFont, System.Drawing.Brushes.Black, 0, 0)
                    NouvellePage = False
                End If
     
                If cmptLig > LignePerPage Then
                    YPos = 50
                    e.HasMorePages = True
                    NouvellePage = True
                    Exit For
                ElseIf pos > ListView1.Items.Count - 1 Then
                    'travail termine
                    e.HasMorePages = False
                    pos = 0
                    Exit For
                End If
                For clm As Int32 = 0 To ListView1.Columns.Count - 1
                    e.Graphics.DrawString(ListView1.Items(pos).SubItems(clm).Text, ListView1.Font, Brushes.Black, XPos, YPos) ' New Font("Arial", 15, FontStyle.Regular)
                    XPos += ListView1.Columns(clm).Width 'la position horisontale
                Next
                YPos += HauteurTexte
                XPos = 0
                pos += 1
            Next
            If e.HasMorePages = False Then pos = 0 'Si il n'y a que une page on met la variable statique a 0
        End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Btnprint_Click(ByVal sender As Object, ByVal e As EventArgs) Handles BtnPrint.Click
            PrintDocument1.DocumentName = "Acteurs sans photo"
            PrintDocument1.DefaultPageSettings.Margins = New Margins(50, 10, 50, 110) 'definir les marges
            PrintDocument1.OriginAtMargins = True 'appliquer les marges définies
            PrintDocument1.DefaultPageSettings.Landscape = False 'mode portret
            PrintPreviewDialog1.Document = PrintDocument1 'Chargement du document dans l'apperçu
            PrintPreviewDialog1.WindowState = FormWindowState.Maximized
            PrintPreviewDialog1.ShowDialog() 'Affichage du dialogue
        End Sub
    Merci encore

  9. #9
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour,

    C'est à toutes fins utiles que je t'envoie Imprimer.pdf, un extrait de cours sur l'impression, car je pense que tu connais déjà les outils dont il est question. Mais je t'envoie aussi projet de test d'une méthode d'impression que j'utilise ordinairement ImpresionES.zip. Je me doute bien que tu ne vas par récrire tout ton code alors qu'il fonctionne mais pour une autre fois, avec une autre organisation du code, cela te servira peut-être.

    On peut bien sûr faire plus simple mais la méthode a ses avantages. Son principe de base est le suivant :
    • Là où il est nécessaire d'imprimer, j'envoie les données dans un fichier TXT. C'est une opération facile qui ne demande aucune mise en page
    • Une fois le fichier terminé, j'appelle les codes d'impression et là, je relis le fichier et je m'applique à régler le format d'impression pour chaque donnée, c'est le travail difficile.

    Le bénéfice de la méthode est de ne pas se soucier de la mise en page là où on se préoccupe davantage de la présentation à l'écran et de la validité des données et des actions de l'utilisateur. Dans les codes d'impression, je ne m'occupe plus que de l'impression.

    Vois la vidéo : https://www.dropbox.com/s/ixp23rf7p6...merMP.mp4?dl=0

    J'espère que cela te sera utile ...

    Nom : ImprimirES.jpg
Affichages : 336
Taille : 102,3 Ko

  10. #10
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    @ProgElect : merci de ne pas coller ce message au précédent, ils sont assez différents sur le contenu

    @Jean-Luc
    Nos messages se sont croisés ...

    Je trouve quelques problèmes potentiels dans ton code.

    D'abord, tu déclare une variable Text de type String. Il y a problème potentiel car Text est un mot du langage. Il serait donc prudent de renommer cette variable Texte, ou Phrase, ou ...

    Pour ce qui est de l'entête des colonnes, ne serait-il pas convenable de placer l'impression là où tu demandes l'impression du titre ?

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
            Dim TEXTE As String = "                              Acteurs et actrices sans photo"
            Dim Entete As String
            Dim printFont As New System.Drawing.Font("Comic sans MS", 10, System.Drawing.FontStyle.Bold)
     
            'Declaration d'une variable "statique" pour pouvoir parcourir le listView en cas des plusieurs pages
            Static pos As Int32 = 0
            Static NouvellePage As Boolean = True
            Dim HauteurTexte As Single = e.Graphics.MeasureString("X", Me.ListView1.Font).Height 'Recuperation d'hauteur du texte
            Dim LignePerPage As Int32 = CInt(e.MarginBounds.Height / HauteurTexte) 'Calcul de nombre des lignes par page
            Dim XPos, YPos As Single 'Les positions temporaires
            YPos = 50 'HauteurTexte
            XPos = 0
     
            Entete = " " & ListView1.Columns(0).Text & "   " & ListView1.Columns(1).Text
     
    ' ??????      e.Graphics.DrawString(Entete, printFont, System.Drawing.Brushes.Black, 0, 20)
     
            For cmptLig As Int32 = 0 To ListView1.Items.Count - 1
     
                If NouvellePage Then
                    'imprime en-tête
                    e.Graphics.DrawString(TEXTE, printFont, System.Drawing.Brushes.Black, 0, 0)
                    NouvellePage = False
     
     
    e.Graphics.DrawString(Entete, printFont, System.Drawing.Brushes.Black, 0, 20)   ' ????
     
                End If
     
    ' ... ... ...

  11. #11
    Membre éclairé
    Inscrit en
    Mai 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Âge : 71

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 304
    Par défaut
    Merci de tes conseils
    Je change Text en Texte ( je n'y avait pas fait attention )
    A plus peut-être

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/09/2007, 22h42
  2. Ajouter un titre au dessus d'un groupe de subplots
    Par soeursourire dans le forum MATLAB
    Réponses: 3
    Dernier message: 26/06/2007, 14h52
  3. ListView > Ajouter des titres
    Par xela dans le forum C++Builder
    Réponses: 1
    Dernier message: 22/05/2007, 17h35
  4. Ajouter des titres a une matrice
    Par sseneor dans le forum MATLAB
    Réponses: 8
    Dernier message: 24/04/2007, 20h13
  5. Comment ajouter de mode d'impression paysage
    Par Volazara dans le forum MFC
    Réponses: 1
    Dernier message: 05/01/2006, 10h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo