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 :

Impression Table Layout Panel et son contenu


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 338
    Par défaut Impression Table Layout Panel et son contenu
    Bonjour,

    Je souhaite après un click sur un bouton imprimer un Table Layout Panel et son contenu. Le tout qui tienne sur une page (il faut le redimensionner pour qu'il tienne sur une seule page) en orientation portrait. Je souhaite également pouvoir sélectionner mon imprimante.

    J'ai parcouru le forum de nombreux post traitent ce problème, seulement le fait d'être débutant ainsi que le manque d'indications (ou explications) m'empêchent de l'adapter à mon cas, je consulte également le tutoriel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://bidou.developpez.com/tutoriels/dotnet/impression/
    mais le code est peu commenté et je ne vois pas comment faire. J'ai néanmoins commencé à réalisé un bout de code :

    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
     Imports System.Drawing
    Imports System.Drawing.Imaging
    Imports System.Drawing.Printing
    Imports System.IO
     
    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
            Dim doc As New PrintDocument
            Dim PageSetup As New PageSetupDialog
     
            Me.PrintDocument1.DefaultPageSettings.Landscape = True
            Me.PrintDocument1.OriginAtMargins = True
            Me.PrintPreviewDialog1.ShowDialog(Me)
        End Sub
     
     
        Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
            Dim XPos, YPos As Single
            Dim ChaineImpr As String
            Using MyGr As Graphics = e.Graphics
     
            End Using
        End Sub
    Mon form possède un Printdocument et un printpreviewdialog

    Merci par avance de votre aide

  2. #2
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Par défaut
    Bonjour,

    Le cours de Ph. Lasserre et particulièrement la partie impression explique très bien cela.

    pour spécifier l'imprimante dans le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                pd.PrinterSettings().PrinterName = strPrinter
                pd.DefaultPageSettings.PaperSource = _
                pd.PrinterSettings.PaperSources.Item(iIndexBacJaune)
    et en dehors du code, voir la partie du cours consacré

    Si vous avez une question précise, n'hésitez pas.

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 338
    Par défaut
    Bonjour Sankasssss,

    Merci pour ta réponse, il est indéniable que le cours de Ph. Lasserre est excellent. Cependant la partie impression, je m'excuse laisse à désirer ... Toutefois le conseil indiqué :

    Prévoir une longue soirée, au calme, un bon siège, 1 g de paracétamol et un gros thermos de café!!
    est tout à fait pertinent et censé

    En effet simple débutant je n'y comprends rien, le code n'est ni commenté ni expliqué comment s'y retrouver ?

    A l'heure actuelle j'ai réalisé un gros programme très performant qui fonctionne très bien et ce grâce au cours de Ph. Lasserre.

    Des questions précises ? Très bien :

    Comment je récupère mon TableLayoutPanel5 pour l'imprimer ?
    Comment je le redimensionne pour qu'il tienne sur une page ?

    Pour ce qui est du choix de l'imprimante, je vais passer par un PrintDialog1 :

    Comment je valide l'impression ?


    Voici mes trois questions qui actuellement me bloquent dans la finalisation de mon programme. J'ai beau chercher sur le forum et dans les tutoriels je n'arrive pas à comprendre la logique et le code de l'impression.

    Merci d'avance de bien vouloir m'aider, (je ne souhaite pas que l'on fasse à ma place je veux apprendre je veux que l'on m'explique pour que je puisse réaliser)

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    toncontrol.DrawToBitmap (fournir un system.Drawing.bitmap créé avec la surcharge du new qui demande width et height je pense, le rectangle qui va avec je pense ou toncontrol.clientrectangle (à tester))
    puis e.Graphics.Drawimage(le bitmap, destrect, sourcerect etc...)

    la surcharge de drawimage demande destrect et sourcerect permet le redimensionnement
    le destrect est à créer à partir de printablearea ou bounds (à tester aussi)
    le sourcerect est 0,0,bitmap.width, bitmap.height

    voir avec les dpi et les units si l'image est moche à l'impression, car l'écran est en 96 dpi, et du 96dpi imprimé c'est pas top donc redimensionné c'est peut etre pire

    il faut en effet un peu de paracétamol tellement ces classes sont peu pratiques (par exemple des pagessettings qui se retrouvent sur plusieurs classes, rien n'est intuitif etc...)


    NB : dans l'event printpage, si on met e.hasmorepages = true, à la sortie de l'event celui ci est redéclenché, ca permet de faire une impression sur plusieurs pages, par contre vu qu'on tombe dans la même méthode le code est chiant à écrire (d'où le paracétamol une fois de plus) et peut devenir illisible (paracétamol si relecture plusieurs mois plus tard)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Using MyGr As Graphics = e.Graphics
     
    End Using
    retire ce using, il est plus destructeur qu'utile, si un évènement te donne une variable ce n'est pas à toi de la détruire
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    Bonjour Vincent32...
    Comme dis par Pol63 ,tu dois utiliser Control.DrawToBitmap (de ton TableLayoutPanell)....
    Maintenant la resolution d'image generee est de 96 dpi "logiques" ..pas fameux....
    code exemple avec un TableLayoutPanel avec gestion des marges....à remplir avec des controles par tes soins....
    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
    55
     
    '- ajoute pour tester l'exemple:
    '- un bouton ApercuImp
    '- un TableLayoutPanel1  sur le WinForm 
    '- PrintDocument
    '- PrintPreviewDialog
    Imports System.Drawing.Printing
    Public Class frmPrintTableLayoutPanel
        Public Sub New()
     
            ' Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            btnApercuImp.Dock = DockStyle.Top
            ' Un simple control TableLayoutPanel que j'ai rempli avec d'autres controls
            ' Dock en fill et positionne en dessous du bouton
            Me.TableLayoutPanel1.Dock = DockStyle.Fill
            'Maximize la taille du form
            Me.WindowState = FormWindowState.Maximized
        End Sub
     
        Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
            Dim MyGr As Graphics = e.Graphics
            'Met PageUnit à Display (apercu conforme à sortie printer)
            MyGr.PageUnit = GraphicsUnit.Display
            MyGr.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
            MyGr.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
     
            'Envoie TableLayoutPanel dans un bitmap avec Control.DrawToBitmap
            Dim memoryImagePanel = New Bitmap(Me.TableLayoutPanel1.Bounds.Width, Me.TableLayoutPanel1.Bounds.Height, MyGr)
            Me.TableLayoutPanel1.DrawToBitmap(memoryImagePanel, Me.TableLayoutPanel1.Bounds)
     
            'code .net managed qui recopie l'image en gardant les proportions 
            'rect source =>memoryImagePanel 
            Dim RectSource As RectangleF = New Rectangle(0, 0, memoryImagePanel.Width, memoryImagePanel.Height)
            'definit les "marges" diaboliques
            Dim myMargin As Margins = New Margins(20, 20, 20, 20)
            'les assignes à  PrintDocument1
            PrintDocument1.DefaultPageSettings.Margins = myMargin
     
            'rect destination c'est notre format de page choisi par user (A4,A3 etc...)
            'il se trouve dans e.MarginBounds que nous avons personnalise cette fois
            Dim RectDest As RectangleF = e.MarginBounds
     
            'surcharge de DrawImage qui recopie l'image en gardant les proportions 
            MyGr.DrawImage(memoryImagePanel, RectDest, RectSource, GraphicsUnit.Pixel)
     
        End Sub
     
        Private Sub btnApercuImp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnApercuImp.Click
            PrintPreviewDialog1.Document = PrintDocument1
            PrintPreviewDialog1.ShowDialog()
        End Sub
    End Class
    bon code............

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 338
    Par défaut
    Je travaille encore dessus, j'essaye par moi même et si j'ai plus de questions je reviens vers vous.

    Mon problème majeur à l'heure actuelle est que le table Layout est plus grand que l'écran (scroll bar latérale et verticale) or il ne m'imprime que la partie visible à l'écran et non toute ma table layout

    Je regarde le code et j'essaye le code fourni page 50 de ce document :

    http://bidou.developpez.com/tutoriel...et/impression/

    Si vraiement je bloque je reviens vous voir

    En tout cas merci beaucoup pour les solutions apportées et le code commenté !

Discussions similaires

  1. [Débutant] Exportation des Table Layout Panel vers PDF- VB .NET
    Par Aiman.elmachi dans le forum VB.NET
    Réponses: 0
    Dernier message: 12/06/2014, 11h26
  2. table layout panel en c#
    Par zouarimariem dans le forum Windows Forms
    Réponses: 0
    Dernier message: 10/04/2012, 00h09
  3. Design Table Layout Panel
    Par r0seBa dans le forum C#
    Réponses: 1
    Dernier message: 25/06/2010, 13h20
  4. Addrow table layout panel
    Par r0seBa dans le forum Windows Forms
    Réponses: 5
    Dernier message: 10/01/2010, 16h27
  5. [procedure stockee] - Dupliquer une table et son contenu
    Par captusite dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 14/01/2006, 13h30

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