1

listView 項目の印刷に問題があります。私が思う問題は、private void PrintPageDetail(PrintPageEventArgs e) これが起こっていることです:

  1. 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) に入るたびに、foreach ループを使用しているため、_factorsView の先頭から開始するという事実です。代わりに、このメソッドの外にいる場所を追跡する必要があります。このようなもの:

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 に答える