在WinForms中打印多个页面;不起作用
本文关键字:不起作用 WinForms 打印 | 更新日期: 2023-09-27 18:25:10
来自问题
答案很快,我偶然发现了升级后的问题。
我已经更改了我的程序以从DB中填充一些数据集。
我在printDocument
上调用Print()
,一切正常,它只是不想注册我的e.HasMorePages = true;
这是代码:
public static void printDokument()
{
if (result == DialogResult.OK)
{
DbDataPostavke = checkDB("SELECT * FROM " + tipDokumenta + "_postavke WHERE ID_" + tipDokumenta + " = " + stDokumenta);
list = DbDataPostavke.Tables[0].AsEnumerable().ToList();
printDocument.Print();
}
}
static void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{
graphic = e.Graphics;
e.PageSettings.PaperSize = ps;
stranSirina = e.PageSettings.PrintableArea.Width;
stranVisina = e.PageSettings.PrintableArea.Height;
fontHeight = font.GetHeight();
//this works/prints
printDocument_PrintHeader();
//this works/prints
printDocument_PrintDocumentInfo();
if (firstPage) printDocument_PrintSupplierInfo();
//Lines that I take from DB, amount of this lines is variable //it only prints one page, then it stops printing
printDocument_PrintProductLines(e);
//Sum of lines
if(zadnjaStran) printDocument_printSum();
//prints comment on document
if (zadnjaStran) printDocument_PrintComment();
//footer
printDocument_PrintFooter();
}
static void printDocument_PrintProductLines(PrintPageEventArgs e)
{
//I print some stuff here (header, etc..)
String stranArtikliVrstica = String.Empty; // string for one line of data
DataRow dataRow1 = null;
DataRow dr = null;
for(int i = 0; i < list.Count(); i++)
{
dr = list[i];
dataRow1 = poglejBazo("SELECT ime, EM, opis FROM Sifrant WHERE ID = " + dr[2].ToString()).Tables[0].Rows[0];
stranArtikliVrstica = String.Format("{0,-38} {1,10} {2,5} {3,9:C} {4,9:C}", dataRow1[0].ToString() + " - " + dataRow1[2].ToString(), dr[3].ToString(), dataRow1[1].ToString(), dr[4], Convert.ToInt16(dr[3]) * Convert.ToInt16(dr[4]));
list.Remove(dr);
graphic.DrawString(stranArtikliVrstica, font, brush, startX + offsetX, startY + offsetY);
offsetY += (int)font.GetHeight();
//if there is less then 35 "lines" remaining, we have enough space for printing some other stuff, otherwise, that stuff doesn't print..
if (list.Count() < 35) zadnjaStran = true;
else zadnjaStran = false;
if (offsetY > stranVisina - 50)
{
prvaStran = false;
stevecStrani++;
offsetY = 0;
e.HasMorePages = true;
return;
}
}
}
因此,当我尝试用一页打印文档时,一切都可以,但如果我尝试用多页打印文档,只有第一页打印(页眉、DocumentInfo、SupplierInfo、ProductLines(80行中约有38行)、页脚),然后就没有更多的页面了(我正在测试打印成PDF文件。)
我做错了什么?
PrintProductLines
中的e参数有问题吗?我如何告诉函数PrintProductLines
我想从原始函数触发e上的HasMorePages
?我知道我可以通过引用传递它,但ref关键字在我的情况下不起作用:S
编辑:
更改static void printDocument_PrintProductLines(ref PrintPageEventArgs e)
和printDocument_PrintProductLines(ref e);
会引发错误:
错误2参数1必须与关键字"ref"一起传递
错误1的最佳重载方法匹配'GZIG.globalClass.printDocument_PrintPostavke(参考System.Drawing.Printing.PrintPageEventArgs)'有一些无效自变量
您不应该将这样的打印代码放入静态全局类中。
此例程属于将使用Graphics对象的类的实际实例。
private const int PAD = 4;
private int m_Line, m_LinesToPrint;
private Font m_Font;
private PrintDocument m_Doc;
private void print_Click(object sender, EventArgs e) {
using (var dlg = new PrintPreviewDialog()) {
if (m_Doc == null) {
throw new NullReferenceException("Create the document before trying to print it.");
}
dlg.Document = m_Doc;
m_Line = 0;
m_LinesToPrint = list.Count;
m_Font = new Font("Courier New", 14, FontStyle.Underline, GraphicsUnit.Point);
dlg.ShowDialog();
}
}
private void printDocument1_PrintPage(object sender, PrintPageEventArgs e) {
float lineHeight = m_Font.GetHeight(e.Graphics) + PAD;
float yLineTop = e.MarginBounds.Top;
for ( ; m_Line < m_LinesToPrint; m_Line++) {
if (e.MarginBounds.Bottom < (yLineTop + lineHeight)) {
e.HasMorePages = true;
return;
}
DataRow dr = list[m_Line];
DataRow row1 = poglejBazo("SELECT ime, EM, opis FROM Sifrant WHERE ID = " + dr[2].ToString()).Tables[0].Rows[0];
string strText = String.Format("{0,-38} {1,10} {2,5} {3,9:C} {4,9:C}", dataRow1[0].ToString() + " - " + dataRow1[2].ToString(), dr[3].ToString(), dataRow1[1].ToString(), dr[4], Convert.ToInt16(dr[3]) * Convert.ToInt16(dr[4]));
// list.Remove(list[m_Line]) <= DO NOT DO THAT!
e.Graphics.DrawString(strText, m_Font, Brushes.Black, new PointF(e.MarginBounds.Left, yLineTop));
yLineTop += lineHeight;
}
e.HasMorePages = false;
}