tisk mezistránek, tisk na novou stranu   otázka

VB.NET

Trápím se s tiskem na více stran.

e.hasmorepages by mělo přidávat stránky, ale mě to prostě nefunguje. :-(

Co dělám špatně? Tiskne mi to pořád na první stranu.

Existuje ve VB.NET 2010 něco jako bylo ve vb 6.0 Printer.NewPage?

Public Class Form1

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

PrintPreviewDialog1.Document = PrintDocument1

PrintPreviewDialog1.PrintPreviewControl.Zoom = 1.0

PrintPreviewDialog1.Text = "Náhled"

PrintPreviewDialog1.WindowState = FormWindowState.Maximized

PrintPreviewDialog1.ShowDialog()

End Sub

Private Sub PrintDocument1_PrintPage(sender As System.Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

e.Graphics.DrawString("xxx", Font, Brushes.Black, 90, 90)

e.HasMorePages = True

'tenhle text by měl být už na druhé straně

e.Graphics.DrawString("YYY", Font, Brushes.Blue, 120, 120)

e.HasMorePages = False

End Sub

End Class

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý den,

Je dobré pro přehlednost, když píšete kód, použít tlačítko VB code. Jinak, zdá se, že jste špatně pochopil vlastnost HasMorePage. Procedura PrintDocument1_PrintPage se vyvolá pro každou stránku opakovaně a to do té doby, dokud budete nastavovat tuto vlastnost na True. Příklad:

Private Strana As Integer

Private Sub PrintDocument1_PrintPage(....) Handles PrintDocument1.PrintPage
    e.Graphics.DrawString("Strana " & Strana.ToString, New Font("Arial", 11), Brushes.Black, 50, 50)
    Strana += 1
    If Strana < 3 Then e.HasMorePages = True
End Sub

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak po několika dnech pátrání po celém googlu jsem konečně pochopil hasmorepage. Podle dotazů na googlu to lidé moc nechápou i když je řešení před očima.

Děkuji.

Myslím, že tohle spoustě lidem, kteří začínají s tiskem pomůže.

No to vymýšlel zase nějaký kokot.

A pozor!!!

Kdo navíc používáte printpreviewdialog!!!

Pokud si uděláte náhled musíte při e.hasmorepages = false vynulovat všechna počítadla (třeba stránek) a pokud procházíte např. databázi od prvního do posledního záznamu, tak i znovu nastavit pozici na první záznam.

Náhled tady totiž neznamená náhled, ale celý tisk znovu. Jinak to bude tisknout jen poslední stránku nebo záznam.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

zdravím podla toho vasho prikladu by mal fungovať aj moj kod , ale podobne ako kolegovi to vytlači iba 1 stranku

Dim drawFont As New Font("Free 3 of 9 Extended", NumericUpDown1.Value)
Dim arialFont As New Font("arial", NumericUpDown1.Value / 4)
        Static CurrentYPosition As Integer = e.MarginBounds.Top
        Dim velkostitem As Integer = (ListView1.Items.Count) * (NumericUpDown1.Value + 20)
         
       For Each item As ListViewItem In ListView1.Items
            Dim text As String = String.Empty
            Try
                text = LSet(item.SubItems(1).Text, 7)
            Catch ex As Exception

            End Try
            Dim codestr As String = ("*" & item.Text & text & "*")   
            e.Graphics.DrawString(codestr, drawFont, Brushes.Black, e.MarginBounds.X, CurrentYPosition)
            e.Graphics.DrawString(item.Text & vbTab & text, arialFont, Brushes.Black, e.MarginBounds.X + 30, CurrentYPosition + NumericUpDown1.Value)
            CurrentYPosition += NumericUpDown1.Value + 20

            If CurrentYPosition < velkostitem + e.MarginBounds.Top Then
                e.HasMorePages = True
            Else
            




                e.HasMorePages = False
               
                CurrentYPosition = 0
                'Exit For
                '
            End If

        Next
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý den,

proč nastavujete vlastnost HasMorePage v každém cyklu smyčky? Musíte nejprve vytisknout vše, co se na jednu stránku vejde a až poté nastavit tuto vlastnost podle toho, jestli jste vytisknul vše co jste potřeboval, nebo ne. Jestliže ne, nastavíte vlastnost na True a tím vyvoláte proceduru znovu. Poté tisknete už na další stránku, ale musíte pokračovat tam kde jste před tím skončil.

V rychlosti jsem napsal ještě jeden příklad, není tam ale výpočet kolik řádek se vejde na stránku při různé velikosti písma, je tam natvrdo 45 řádek pro písmo Arial 10. Je to pouze příklad pro pochopení funkce!

    ' Určuje celkový počet vytisknutých řádek
    Private PrRadky As Integer

    ' Určuje číslo aktuálně tisknuté stránky
    Private PrStrana As Int16 = 1

    Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        ' Písmo pro tisk
        Dim PrintFont As New Font("Arial", 10, FontStyle.Regular)

        ' Horní okraj stránky
        Dim CurrYPos As Integer = e.MarginBounds.Top

        For i As Integer = PrRadky To ListView1.Items.Count - 1
            e.Graphics.DrawString(ListView1.Items(i).Text, PrintFont, Brushes.Black, e.MarginBounds.Left, CurrYPos)
            CurrYPos = CurrYPos + 20
            PrRadky += 1

            ' Konstanta 45=počet řádek na stránku
            If PrRadky >= (PrStrana * 45) Then Exit For
        Next

        If ListView1.Items.Count > PrRadky Then
            ' Je potřeba další stránka
            e.HasMorePages = True
            ' Zvýšíme číslo číslo aktuálně tisknuté stránky
            PrStrana += 1
        Else
            ' Vše vytisknuto
            e.HasMorePages = False
            ' Číslo aktuálně tisknuté stránky nastavíme na 1 (pro další tisk)
            PrStrana = 1
            ' Vynulujeme celkový počet vytisknutých řádek
            PrRadky = 0
        End If

    End Sub

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

proč? , lebo ja to slabo popísané.

dal som msgbox do prikladu od ms a ten mi ukazoval že text.lenght sa nemení až do konca., že je to niečo ako

not eof

koncekoncov to som skušal miesto velkostitem som dal

e.MarginBounds.Bottom

ale nefungovalo to.

nechápem aký ma zmysel prstrana

PrStrana += 1

síce počíta spravne ale nie je nikde použitý snád len pre označenie stránky

konieckoncov aj tak to nedáva zmysel pretožeby mal najpr prebehnúť cyklus for. jednoducho nikde v tom ms popise nie je napísané že

e.hasmorepages= true

vráti na uplný začiatok cylku. to tam mohli rdšej goto a bolo by jasné.

nakoniec sme na msdn vyriešili takto
Dim text7 As String = String.Empty
        Dim fontsize As Integer = NumericUpDown1.Value
        Dim drawFont As New Font("Free 3 of 9 Extended", fontsize)
        Dim arialFont As New Font("arial", fontsize / 4)
        Dim Y As Integer
        While ItemCount < ListView1.Items.Count
            Dim Item As ListViewItem = ListView1.Items(ItemCount)
            text7 = LSet(Item.SubItems(1).Text, 7)
            Dim codestr As String = ("*" & Item.Text & text7 & "*")
            If Y + drawFont.Height + arialFont.Height > e.MarginBounds.Bottom Then Exit While
            e.Graphics.DrawString(codestr, drawFont, Brushes.Black, 0, Y)
            e.Graphics.DrawString(Item.Text & vbTab & text7, arialFont, Brushes.Black, 30, Y + drawFont.Height)
            Y += drawFont.Height + arialFont.Height
            ItemCount += 1
        End While

        If ItemCount < ListView1.Items.Count Then e.HasMorePages = True

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback