最近在解决分页打印的问题,发现用.Net Framework1.1的PrintDialog的AllowSelection和AllowSomePages设置PrintDocument的分页打印是不起作用的,google了一下也是这样,于是自己想了个办法,原理是这样的:
PrintDocument在打印时,打印每一页都会触发它的PrintPage事件,在该事件中,进行页码的递增和一个重要参数e.HasMorePages的判断,如果该参数为true,就会继续进行下一页的打印,如果为false,就不会继续进行打印。这样,我们就可以利用这一事件进行打印哪些页面的控制。程序逻辑见注释。
变量说明:
m_startPrintPage,打印的起始页码
m_endPrintPage,打印的终止页码
m_PageIndex:当前打印页码
/**/
///<summary>
/// PrintDocument的PrintPage事件,同时实现指定页码范围打印
///</summary>
///<param name="sender"></param>
///<param name="e"></param>
private void printDocument_PrintPage( object sender, System.Drawing.Printing.PrintPageEventArgs e)
... {
try
...{
//如果当前打印页小于打印起始页码,就递增一页,直至等于打印起始页码
if (m_startPrintPage>0) ...{
while (m_PageIndex<m_startPrintPage)
...{
m_PageIndex++;
}
}
伪代码:打印内容
//当前打印页加1
m_PageIndex++;
//如果设置了打印页码范围并且当前打印页大于打印终止页码,终止打印,设置e.HasMorePages参数,初始化相关变量
if ((m_startPrintPage>0)&&(m_PageIndex>m_endPrintPage))
...{
e.HasMorePages=false;
m_PageIndex=1;
return;
}
}
catch
...{
//出错处理,终止打印,设置e.HasMorePages参数,初始化相关变量
e.HasMorePages = false;
m_PageIndex = 1;
}
}
/// PrintDocument的PrintPage事件,同时实现指定页码范围打印
///</summary>
///<param name="sender"></param>
///<param name="e"></param>
private void printDocument_PrintPage( object sender, System.Drawing.Printing.PrintPageEventArgs e)
... {
try
...{
//如果当前打印页小于打印起始页码,就递增一页,直至等于打印起始页码
if (m_startPrintPage>0) ...{
while (m_PageIndex<m_startPrintPage)
...{
m_PageIndex++;
}
}
伪代码:打印内容
//当前打印页加1
m_PageIndex++;
//如果设置了打印页码范围并且当前打印页大于打印终止页码,终止打印,设置e.HasMorePages参数,初始化相关变量
if ((m_startPrintPage>0)&&(m_PageIndex>m_endPrintPage))
...{
e.HasMorePages=false;
m_PageIndex=1;
return;
}
}
catch
...{
//出错处理,终止打印,设置e.HasMorePages参数,初始化相关变量
e.HasMorePages = false;
m_PageIndex = 1;
}
}