1

我在打印 listView 项目时遇到问题。我认为问题出在private void PrintPageDetail(PrintPageEventArgs e) 所以这就是发生的事情:

  1. 它一遍又一遍地打印适合一页的任何内容。(有比打印的更多的数据)虽然页脚和页眉打印正确的页码。而且我很难让它每次都清除内存以在下一页上映射新数据。

  2. 打印预览和打印不会停止,除非我点击取消(可能是由于无限循环“return;”)。

感谢您的任何帮助

private void PrintDocument(object sender, PrintPageEventArgs e)
    {
        // Use inches for all measurements.

        e.Graphics.PageUnit = GraphicsUnit.Inch;

        PrintPageHeader(e);

        PrintPageDetail(e);

        PrintPageFooter(e);
    }

    // Print the page header/footer/details.
    private void PrintPageHeader(PrintPageEventArgs e)
    {
        e.Graphics.DrawString("Factors List Report",
                              _headerFont, _reportBrush, 3.0F, 0.75F);
        e.Graphics.DrawLine(_reportPen, 0.5F, 1.15F, 7.5F, 1.15F);
    }

    private void PrintPageFooter(PrintPageEventArgs e)
    {
        e.Graphics.DrawLine(_reportPen, 1.0F, 10.0F, 7.5F, 10.0F);

        e.Graphics.DrawString("Printed on " + DateTime.Now.ToLongDateString(),
                              _footerFont, _reportBrush, 1F, 10.2F);

        _pageNumber++;
        e.Graphics.DrawString(string.Format("Page: {0}", _pageNumber),
                              _footerFont, _reportBrush, 7F, 10.2F);
    }

    private void PrintPageDetail(PrintPageEventArgs e)
    {
        // Create variables to hold position on page.
        float leftMargin = e.MarginBounds.Left;
        float topMargin = e.MarginBounds.Top;
        float i = 1.25F;


        e.HasMorePages = false;
        foreach (string printerLine in _factorsView)
        {
            e.Graphics.DrawString(printerLine, _detailFont, _reportBrush, 1.0F, i);


            if (i >= 9.75)
            {
                i += 1.25F;
                e.HasMorePages = true;
                return;
            }
            else
                i += .25F;
        }
    }
}
4

1 回答 1

0

问题是每次进入 PrintPageDetail(PrintPageEventArgs e) 时,都会从 _factorsView 的开头开始,因为您使用的是 foreach 循环。您将需要跟踪您在此方法之外的位置。像这样的东西:

int myLocation = 0;

private void PrintPageDetail(PrintPageEventArgs e)  
    {  
        // Create variables to hold position on page.  
        float leftMargin = e.MarginBounds.Left;  
        float topMargin = e.MarginBounds.Top;  
        float i = 1.25F;  


        e.HasMorePages = false;  
        while(myLocation < _factorsView.Length)  
        {  
            e.Graphics.DrawString(_factorsView[myLocation], _detailFont, _reportBrush, 1.0F, i);  
            myLocation++;


            if (i >= 9.75)  
            {  
                i += 1.25F;  
                e.HasMorePages = true;  
                return;  
            }  
            else  
                i += .25F;  
        }  
    }  

我不知道 _factorsView 是什么类型,所以索引可能会根据它的类型而改变,但这应该会给你一个想法。

于 2009-12-02T20:58:37.910 回答