Avatar billede majbom Novice
14. december 2006 - 19:23 Der er 4 kommentarer og
1 løsning

uendelig løkke ved PrintPreviewDialog

jeg bruger denne kode:

private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
{
int x = e.MarginBounds.Left;
int y = e.MarginBounds.Top;
int linesPrinted = 0;
Brush brush = new SolidBrush(SystemColors.ControlDark);

while (linesPrinted < this.lvwPrint.Items.Count)
{
  ListViewItem item = this.lvwPrint.Items[linesPrinted++];
  e.Graphics.DrawString(item.SubItems[1].Text, SystemFonts.DialogFont, brush, x, y);
  y += 15;
  if (y >= e.MarginBounds.Bottom)
  {
  e.HasMorePages = true;
  return;
  }
}
linesPrinted = 0;
e.HasMorePages = false;
}

til at udskrive et listview på min printer og det virker helt fint, så længe at der ikke er flere linjer, end det kan være på een side. hvis det fylder mere end en side, går den i en uendelig løkke, når den skal tælle siderne op i preview-dialogen.
hvis der f.eks. er 70 linjer (der kan være 64 per side) starter den forfra når den når til 64 (jeg har prøvet at udskrive "linesPrinted") og det gør den så, indtil jeg stopper den). koden har jeg taget fra et andet program, hvor det virker fint, der er det dog bare en richtextbox der bliver udksrevet fra...

håber der er nogen der kan hjælpe, kan ikke finde ud af hvad dælen der går galt.

på forhånd tak
Avatar billede bulgroz Nybegynder
14. december 2006 - 23:32 #1
Hmmm... Men du beder den jo også om at starte forfra så vidt jeg kan se.
Du looper altid over den komplette liste, og hvis linierne ikke kan være på en side, siger du at eventet skal rejses igen med "HasMorePages = true", hvorefter samme kode udføres igen.
Avatar billede bulgroz Nybegynder
14. december 2006 - 23:57 #2
Her lige et lille hurtigt modificeret eksempel som anvender ListView.

    public partial class Form1 : Form
    {
        private int counterPrintedLines;

        public Form1()
        {
            InitializeComponent();

            // Demodata...
            for (int i = 0; i < 200; i++)
            {
                ListViewItem item = new ListViewItem(string.Format("Item: {0:D4}", i));
                this.listView1.Items.Add(item);
            }
        }

        private void ButtonPrintClick(object sender, EventArgs eventArgs)
        {
            try
            {
                this.counterPrintedLines = 0;
                PrintDocument printDocument = new PrintDocument();
                printDocument.PrintPage += new PrintPageEventHandler(PrintDocumentPrintPage);
                printDocument.Print();
            }
            catch (Exception exception)
            {
                MessageBox.Show(exception.Message);
            }
        }

        void PrintDocumentPrintPage(object sender, PrintPageEventArgs printPageEventArgs)
        {
            int leftMargin = printPageEventArgs.MarginBounds.Left;
            int topMargin = printPageEventArgs.MarginBounds.Top;
            float y = 0;

            // Calculate the number of lines per page.
            float linesPerPage = printPageEventArgs.MarginBounds.Height / this.listView1.Font.GetHeight(printPageEventArgs.Graphics);

            int linesToPrint = this.listView1.Items.Count;
            int linesPrintedThisPage = 0;

            // Print each line of the file.
            while (linesPrintedThisPage < linesPerPage &&
                  this.counterPrintedLines < linesToPrint)
            {
                ListViewItem item = this.listView1.Items[counterPrintedLines];
                string line = string.Format("{0}", item.Text);

                y = topMargin + (linesPrintedThisPage * this.listView1.Font.GetHeight(printPageEventArgs.Graphics));

                printPageEventArgs.Graphics.DrawString(line, this.listView1.Font, Brushes.Black, leftMargin, y, new StringFormat());
                linesPrintedThisPage++;
                this.counterPrintedLines++;
            }

            printPageEventArgs.HasMorePages = counterPrintedLines < linesToPrint;
        }
Avatar billede bulgroz Nybegynder
15. december 2006 - 00:01 #3
Bør naturligvis udvides så subitems tegnes med. Derudover bør målingen af fontstørrelse ske på det enkelte item, og ikke som her globalt, ved mindre at din udskrift altså kun anvender én fontstørrelse.
Avatar billede majbom Novice
15. december 2006 - 10:28 #4
AAARHG!! hvor er mit indlæg???

nå, prøver igen :)

er kommet lidt længere:

int x = e.MarginBounds.Left;
int y = e.MarginBounds.Top;
Brush brush = new SolidBrush(SystemColors.ControlDark);
while (columnsPrinted < this.lvwPrint.Columns.Count)
{
y = e.MarginBounds.Top;
while (linesPrinted < this.lvwPrint.Items.Count)
{
  ListViewItem item = this.lvwPrint.Items[linesPrinted++];
  e.Graphics.DrawString(item.SubItems[columnsPrinted].Text, SystemFonts.DialogFont, brush, x, y);
  y += 15;
  if (y >= e.MarginBounds.Bottom)
  {
  e.HasMorePages = true;
  return;
  }
}
columnsPrinted++;
linesPrinted = 0;
e.HasMorePages = false;
x += 105;
}

virker fremragende så længe der kun er een side, men hvis der er mere, kommer kolonne 2 på den side hvor kolonne et er færdig... :S

det er åbenbart ikke sådan lige til når det er et listview med flere kolonner?

-> bulgroz - dit eksempel virker fint, bortset fra at problemet med subitems kommer her også :)
Avatar billede majbom Novice
15. december 2006 - 14:44 #5
yes, jeg fandt sq lige på en løsning selv :)

private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
{
int x = e.MarginBounds.Left;
int y = e.MarginBounds.Top;
Brush brush = new SolidBrush(SystemColors.ControlDark);
Font font = new Font("Verdana", 10);
           
while (linesPrinted < lvwPrint.Items.Count)
{
  x = e.MarginBounds.Left;
  while (columnsPrinted < lvwPrint.Columns.Count)
  {
  ListViewItem item = this.lvwPrint.Items[linesPrinted];
  e.Graphics.DrawString(item.SubItems[columnsPrinted].Text, font, brush, x, y);
  x += FindMaxSize(columnsPrinted);
  columnsPrinted++;
  }
  columnsPrinted = 0;
  linesPrinted++;
  y += 15;
  if (y >= e.MarginBounds.Bottom)
  {
  e.HasMorePages = true;
  return;
  }
}
e.HasMorePages = false;
}

den skriver en hel linje ad gangen i stedet for først een kolonne og derefter den næste... det eneste den ikke kan tage højde for, er hvis det er bredere end een side, men det får jeg ikke brug for...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester