C#中的打印分页问题

cdling 2007-10-23 09:07:24
搜索遍了CSDN,没有一篇解决了问题,我的问题是:在预览时看见的多页重复打印了第一页上.代码如下,请求高人赐教.
private void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{
Graphics g = e.Graphics;
int PageCount = 1; //打印页计数器。
int PageTotal = 0; //总计页面数。
Int32 RowCount = 0; //行计数器
Int32 RowPerPage = 0; //每一页能打印的行数。
float TableWidth = 0f; //表格的总宽度。
float PageWidth = e.PageBounds.Width; //页面总宽度。
ArrayList ColumnWidth = new ArrayList(); //保存DataGridView的每一列的宽度。
float PositionX = printDocument.DefaultPageSettings.Margins.Left; //绘制字符串的横向位置
float PositionY = printDocument.DefaultPageSettings.Margins.Top; //绘制字符串的纵向位置

Font pFont = new Font("宋体", 12f, FontStyle.Regular);
if (RowPerPage == 0)//没计算过就算。
{
//计算每页可打印的行数.
RowPerPage = Convert.ToInt32(Math.Truncate((e.MarginBounds.Height - PositionY + printDocument.DefaultPageSettings.Margins.Top) / (pFont.GetHeight(g) + 1)));
//总共有多少页。
PageTotal = Convert.ToInt32(Math.Ceiling((double)dgvMemberAll.Rows.Count / (double)RowPerPage));
}

////逐行的循环打印一页
for (int i = 0; i < dgvMemberAll.Rows.Count; i++)
{
if ((RowCount % RowPerPage) == 0) //换页时打印标题和表头。
{
printTitle("自主自驾游费用结算表", g, PageWidth, ref PositionY); //打印标题。
printTableHander(ref dgvMemberAll, ref ColumnWidth, ref PositionX, ref PositionY, PageWidth, ref TableWidth, g); //打印表头
}
printDataRow(ref PositionX, ref PositionY, dgvMemberAll.Rows[i], TableWidth, ColumnWidth, g); //打印表体的数据行。
//TableWidth = (TableWidth / 96)*100;
//if ((width > 1169))// 210/25.4=8.27
RowCount++;
////
if ((RowCount % RowPerPage) == 0 & RowCount >= 0)
{
//先在页底中间输出页码后分页
Font font = new Font("黑体", 12.0f);
Brush brush = new SolidBrush(Color.Black);
g.DrawString("总共 " + PageTotal.ToString() + " 页,第 " + PageCount.ToString() + " 页", font, brush, e.PageBounds.Width / 2 - 75, e.PageBounds.Height - 60);
if (dgvMemberAll.Rows.Count >= RowPerPage * PageCount)
{
//换页时置打印位置为初始位置。
PositionX = printDocument.DefaultPageSettings.Margins.Left; //绘制字符串的横向位置
PositionY = printDocument.DefaultPageSettings.Margins.Top; //绘制字符串的纵向位置
e.HasMorePages = true;
PageCount++;
}
}
e.HasMorePages = false;
}



}
...全文
1118 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
kaizi_sun 2009-11-20
  • 打赏
  • 举报
回复
我的也是这个问题,打印在第一页上,内容分了页,但不产生新空白页。重叠打印在上面,楼主帮忙提示下
hellomaina 2008-11-11
  • 打赏
  • 举报
回复
a
cdling 2007-10-24
  • 打赏
  • 举报
回复
3.只要HasMorePage=true,就会再调用printDocument_PrintPage()打印更多的页.这次就要用到bookmark.
cdling 2007-10-24
  • 打赏
  • 举报
回复
折腾了几天,终于解决了,在此总结一下,让初学者少一点弯路,也望高手给予指点:
1.printDocument_PrintPage是对页而言的,其内可以有循环但不能跨页.
private void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{
printTitle();
printTableHander();
if(printTableBody())
e.HasMorePage=true;
else
e.HasMorePage=false;
printFooter();
}
2.对于DataTable、DataView、DataGrid、DataGridView 等,在方法内打印数据行到本页满后记住读取数据的位置
private bool printTableBody(bookmark)
{
int RowCount
bool HasMorePage=false;
printDataRow(bookmark)
if(RowCount==RowPerPgae)//本页已打印的行=本页能打印的行,说明要分页,设HasMorePage=true 一送打印二产生新页。
HasMorePage=true;
else
HasMorePage=false;
bookmark+=RowPerPgae;
return HasMorePage;
}
private void pringDataRow(......)
{
//读取数据并用Graphic.DrawLine Graphic.DrawString 将本页画满并计算下一次要使用的bookmark.
}





vwxyzh 2007-10-23
  • 打赏
  • 举报
回复
计数变量放到类里
cdling 2007-10-23
  • 打赏
  • 举报
回复
那datagridview里的数据怎么能读出来?
vwxyzh 2007-10-23
  • 打赏
  • 举报
回复
你的方法就是让它把所有的页都打在同一张纸上。。。。
for (int i = 0; i < dgvMemberAll.Rows.Count; i++)
这里不需要for,打印组件会帮你循环,直到
e.HasMorePages = false;
并退出事件

110,546

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧