Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di xonica
    Registrato dal
    Oct 2003
    Messaggi
    143

    [.net] stampare listview

    Salve a tutti.
    vorrei fare una stampa di una listview ma sto avendo problemi con la stampa su + pagine. non sono sicuro di aver capito benissimo l'uso di e.hasmorepages e pertanto ho molti problemi.

    per esempio ho postato il codice (che potete provare incollandolo tutto in un nuovo progetto) che dovrebbe stampare l'intestazione della mia listview su più pagine ma invece di cambiare pagina mi sovrascrive sempre sulla stessa.... come mai?


    codice:
    Public Class Form1
        Inherits System.Windows.Forms.Form
    
    #Region " Codice generato da Progettazione Windows Form "
    
        Public Sub New()
            MyBase.New()
          InitializeComponent()
       End Sub
    
       Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
          If disposing Then
             If Not (components Is Nothing) Then
                components.Dispose()
             End If
          End If
          MyBase.Dispose(disposing)
       End Sub
    
       Private components As System.ComponentModel.IContainer
    
       Friend WithEvents ListView1 As System.Windows.Forms.ListView
       Friend WithEvents Button1 As System.Windows.Forms.Button
       <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
          Me.ListView1 = New System.Windows.Forms.ListView()
          Me.Button1 = New System.Windows.Forms.Button()
          Me.SuspendLayout()
          '
          'ListView1
          '
          Me.ListView1.Anchor = (((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
                      Or System.Windows.Forms.AnchorStyles.Left) _
                      Or System.Windows.Forms.AnchorStyles.Right)
          Me.ListView1.Location = New System.Drawing.Point(16, 16)
          Me.ListView1.Name = "ListView1"
          Me.ListView1.Size = New System.Drawing.Size(368, 288)
          Me.ListView1.TabIndex = 0
          Me.ListView1.View = System.Windows.Forms.View.Details
          '
          'Button1
          '
          Me.Button1.Location = New System.Drawing.Point(328, 312)
          Me.Button1.Name = "Button1"
          Me.Button1.Size = New System.Drawing.Size(56, 24)
          Me.Button1.TabIndex = 1
          Me.Button1.Text = "print"
          '
          'Form1
          '
          Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
          Me.ClientSize = New System.Drawing.Size(400, 342)
          Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.Button1, Me.ListView1})
          Me.Name = "Form1"
          Me.Text = "Form1"
          Me.ResumeLayout(False)
    
       End Sub
    
    #End Region
    
       Dim WithEvents pDoc As Printing.PrintDocument
    
       Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
          Dim i As Integer, x As Integer, y As Integer
          Dim item As ListViewItem
          For i = 1 To 10
             ListView1.Columns.Add("Colonna " & Str(i), 100, HorizontalAlignment.Left)
          Next
          For x = 1 To 200
             item = ListView1.Items.Add("Item " & Str(x))
             For y = 1 To 9
                item.SubItems.Add("Subitem " & Str(y))
             Next
          Next
       End Sub
    
       Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
          Dim PrintDialog1 As New PrintDialog()
          pDoc = New Printing.PrintDocument()
          PrintDialog1.Document = pDoc
          PrintDialog1.AllowSomePages = True
          If PrintDialog1.ShowDialog() = DialogResult.OK Then
             pDoc.Print()
          End If
       End Sub
    
       Private Sub pDoc_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles pDoc.PrintPage
          Dim i As Integer = 0
          Dim myfont As New Font("Verdana", 10, FontStyle.Regular, GraphicsUnit.Pixel)
          Dim ColWidth As Integer = 0
          Dim PrintRect As Rectangle = e.MarginBounds
          Dim posX As Integer = PrintRect.Left
    
          e.Graphics.DrawLine(New Pen(Color.Black), PrintRect.Left, PrintRect.Top, PrintRect.Right, PrintRect.Top)
          e.Graphics.DrawLine(New Pen(Color.Black), PrintRect.Left, PrintRect.Top + myfont.Height, PrintRect.Right, PrintRect.Top + myfont.Height)
    
          While i < ListView1.Columns.Count
             ColWidth = ListView1.Columns(i).Width
             e.Graphics.DrawString(ListView1.Columns(i).Text, myfont, New SolidBrush(Color.Black), posX, PrintRect.Top)
             e.Graphics.DrawLine(New Pen(Color.Black), posX + ColWidth, PrintRect.Top, posX + ColWidth, PrintRect.Top + myfont.Height)
             posX = posX + ColWidth
             i = i + 1
             If (posX > PrintRect.Right) Then
                e.HasMorePages = True
                posX = PrintRect.Left
             End If
          End While
          If i = ListView1.Columns.Count Then e.HasMorePages = False
       End Sub
    
    
    End Class

  2. #2
    Utente bannato
    Registrato dal
    Mar 2002
    Messaggi
    1,811
    codice:
     If RighePerPagina >= 60 Then 'linesPerPage 60 per font 11 , 61 per 10
                    RighePerPagina = 0
                    PagineStampate = PagineStampate + 1
                    RigaArrivato = i + 1 'nell'altra pagina deve avere la riga successiva
                    e.HasMorePages = True
                    Exit Sub
                End If
    io lo regolo in questo modo
    ovvio che mi sono calcolato circa 60 righe per pagina
    ed ad aogni ciclo valorizzo la variabile righeperpagina

    cmq ho visto il codice
    non male ma...
    1) hai regolato il font? in base alla listview?
    2) nella list view se una riga è tropop lunga escono i puntini...
    3) per non parlare della dimensione delle colonne....

    cmq se vuoi un aiuto...
    quando e quanto vuoi

  3. #3
    Utente di HTML.it L'avatar di xonica
    Registrato dal
    Oct 2003
    Messaggi
    143
    ho trovato la soluzione alla suddivisione delle pagine

    io avevo il problema di suddividere una listview su più pagine sia in larghezza (con priorità) che in lunghezza del tipo qui sotto e mi incasinavo con quel e.hasmorepages.... però adesso è ok. Nel codice che avevo postato c'erano degli errori logici generali. Ho dovuto sganciare la mia mente dalla logica con cui ragionavo e non è stato molto facile dato che ci ho lavorato per una settimana.

    codice:
    _____  _____
    |   |  |   |
    |   |  |   |
    |_1_|  |_2_|
    _____  _____
    |   |  |   |
    |   |  |   |
    |_3_|  |_4_|

    comunque per quanto concerne il problema della larghezza delle colonne in stampa avevo delle idee in merito. Fare in modo che quando avvio la stampa della listview da codice mi creo una copia della stessa e adatto tutte le colonne al contenuto, quindi stampo copia_listview. C'è un modo per fare questo da codice?????
    Per quanto riguarda il font io mi calcolo il numero delle righe per pagina in modo automatico usanto font.height in modo che l'utente possa decidere di che grandezza vuole il carattere e in modo che possa scegliere anche i bordi di pagina.

    Comunque questo controllo per la stampa della listview è molto ricercato su internet. Ce ne è uno se ne può vedere uno a pagamento su http://www.winformreports.co.uk/ListViewSample1.gif (299$) ma io sono quasi arrivato ad emularlo interamente .... quando lo avrò terminato (MAX altri 3 gg) ne metterò probabilmente uno on-line



    ci tengo a precisare che apprezzo moltissimo il contributo di amodio che è sempre pronto ad aiutare gli altri.... (comunque il codice che mi hai postato l'avovo già trovato in giro per la rete ... è famoso :metallica )

  4. #4
    Utente bannato
    Registrato dal
    Mar 2002
    Messaggi
    1,811
    Originariamente inviato da xonica
    ho trovato la soluzione alla suddivisione delle pagine
    Fare in modo che quando avvio la stampa della listview da codice mi creo una copia della stessa e adatto tutte le colonne al contenuto, quindi stampo copia_listview. C'è un modo per fare questo da codice????? mi hai postato l'avovo già trovato in giro per la rete ... è famoso :metallica )
    man mano che fai un drawstring ovviamente come coordinata x ti calcoli la larghezza di ogni colonna e la sommi alle colonne precedenti,
    solo cosi' puoi avere una stampa simile alla listview, renditi conto che qui nasce anche un'altro problema!: devi cercare di adattare la stringa in base alla larghezza della colonna!, con un len() forse...ma devi usare un controllo + preciso in quanto dipende anche dal carattere la lunghezza della stringa!, ovvio che se riesci a mandarla a capo "è un'altro paio di maniche"

  5. #5
    Utente di HTML.it L'avatar di xonica
    Registrato dal
    Oct 2003
    Messaggi
    143
    codice:
    Private Function TroncaParola(ByVal text As String, ByVal f As Font, ByVal WidthX As Double) As String
      On Error Resume Next
      Dim NumLettere As Integer = Len(text)
      Dim WidthMax As Double = WidthX
      Dim gr As Graphics
      Dim Lettera As String
      Dim txt As String
      Dim i As Integer
      i = 1
      While i <= NumLettere And WidthMax > 0
         Lettera = Mid(text, i, 1)
         txt = txt & Lettera
         gr = form1.CreateGraphics
         WidthMax = WidthX - gr.MeasureString(txt, f).Width
         i = i + 1
      End While
      If WidthMax <= 0 Then
         TroncaParola = Microsoft.VisualBasic.Left(txt, Len(txt) - 1)
      Else
         TroncaParola = txt
      End If
    End Function
    con questa funzione se invio il testo da stampare, il font usato e la larghezza della colonna mi restituisce il testo che è possibili visualizzare togliendo le lettere che non entrerebbero.

    volevo soltanto sapere quando carichi dati nella listview tu dai delle larghezze alle colonne item.add(str,100 ,..).... poi nel caso tu clicchi sul bordo della colonna quella si adatta al contenuto.

    C'è un modo per fare questo via codice????
    Mi servirebbe sapere solo questo

  6. #6
    Utente bannato
    Registrato dal
    Mar 2002
    Messaggi
    1,811
    Originariamente inviato da xonica
    [CODE]

    volevo soltanto sapere quando carichi dati nella listview tu dai delle larghezze alle colonne item.add(str,100 ,..).... poi nel caso tu clicchi sul bordo della colonna quella si adatta al contenuto.

    C'è un modo per fare questo via codice????
    Mi servirebbe sapere solo questo
    spiegati meglio non ho capito,

  7. #7
    Utente bannato
    Registrato dal
    Mar 2002
    Messaggi
    1,811
    299 sterline secondo me sono troppe!
    forse ha funzionalita enormi quel link che hai posato

    renditi c onto che la listview del .net puo' colorare sia il font che lo sfondo di ogni singola cella, ed a stamparla non ci vuole mica 1 settimana per creare il tutto!!
    (se implementi degli oggett igrafici del tipo drawrectangle, questo lo puoi colorare ed impostare le dimensioni....

  8. #8
    Utente di HTML.it L'avatar di xonica
    Registrato dal
    Oct 2003
    Messaggi
    143
    in vb.net
    nel creare la listview tu indichi la larghezza della colonna a priori. poi ci vai a mettere il testo dentro. se il testo non entra nella colonna il controllo listview mette i puntini.

    Però se clicchi nella listview sul bordo di una colonna quella stessa colonna si adatta al contenuto.

    guarda le foto

  9. #9
    Utente bannato
    Registrato dal
    Mar 2002
    Messaggi
    1,811
    non penso proprio sia un problema in quanto

    1) gia tu quando crei la listview, determini la larghezza delle colonne, quindi sai gia doce ci sono numeri (colonne corte) e dove ci sono nome di persone(colonne larghe) e ti regoli di conseguenza)

    2) se proprioil cliente si ci diverte ad ingrandirle e stringerle ufffff glielo dici-->"ue, se non vedi bene la colonna nella stampa, allarga la colonna nella lista!!!"

    3) ora mi hai fatto pensare ad un'altro problema: in una stampa devi determinare anche quante colonne ha la listview e farle entreare nella stampa!!!
    cazz. se una listview ha 10 colonne? come fai?un conto visualizarle in un form, se è + lunga compar la barra di scorrimento, ma in una stampa? secondo me dovresti cerare un'altra procedura per vedere se la somma della larghezza delle colonne supera la larghezza del foglio, se si, allora di conviene acocrciarle in qualche modo per frle entrare, altrimenti chiedi se stampare in senso orizzontale

  10. #10
    Utente di HTML.it L'avatar di xonica
    Registrato dal
    Oct 2003
    Messaggi
    143
    beccatevi sto codice

    codice:
    Sub AutoArrangeColumnWidth(ByVal cListView As ListView)
      Dim i As Integer, x As Integer
      Dim gr As Graphics
      Dim itemSizeMax As Integer
      cListView.BeginUpdate()
      gr = Me.CreateGraphics
      For x = 0 To cListView.Columns.Count - 1
        itemSizeMax = 0
        For i = 0 To cListView.Items.Count - 1
          If gr.MeasureString(cListView.Items(i).SubItems(x).Text, cListView.Font).Width > itemSizeMax Then
          itemSizeMax = gr.MeasureString(cListView.Items(i).SubItems(x).Text, cListView.Font).Width
          End If
        Next
        cListView.Columns(x).Width = itemSizeMax
      Next
      cListView.Refresh()
      cListView.EndUpdate()
    End Sub
    vi adatta la listview al contenuto !!!!!!!


    CIAUZZZZZZZZ

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.