c# ListView打印类

<span style="font-size:18px;">ListView打印类
/*
无需导入com组件,无需绑定Datatable,将 listview 声明为此类的实例,再直接调用 doprint()方法就可以进行打印了,

非常方便简单。

下面是原代码: 
*/

using System;    
using System.Drawing;    
using System.Collections;    
using System.ComponentModel;    
using System.Windows.Forms;    
using System.Data;    
using System.Drawing .Printing ;    
  
namespace UI_Form {    
/*  
  * 属性:   
*PrintHeaderString : 设置打印的标题;   
*IsAlwaysPrintHeader : 设置是否在每页都打印标题;   
*IsPreview : 设置是否进行预览;   
*LineSpace : 设置打印的行距   
*HeaderFont : 设置标题的字体   
*BodyFont : 设置正文的字体   
*TailFont : 设置页尾的字体   

以下为源代码:   
* -----------------------------------------------------------------------------------------   
  * 【文件名】: PrintListView.cs   
  * 【说  明】: 支持 ListView 的所见即所得的打印的类   
  *            1、整个打印的部分分为页首、正文、页尾三个部分;   
  *            2、正文部分打印 ListView 的 ColumnHeader 以及 ListView 的 Items,通过 PrintPageBody() 实现;   
  *            3、页首、页尾的打印自由定制,默认的行为是页首打印标题,页尾打印页码和时间,需要改变页首和页尾的默认打印方式,可以对 PrintPageHeader() 和 PrintPageTail() 函数进行重写,并进行打印区域的重新计算;  
  *            4、支持预览   
  *            5、支持打印设置,如:是否每页都打印标题,设置页首、正文、页尾的打印字体,等。   
  *               
  * 【作  者】: sashow ( sashow @ 163.com )   
  * 【日  期】: 2005.05.10   
  * ----------------------------------------------------------------------------------------*/    
/// <summary>    
/// ListView 的所见即所得的打印支持类。    
/// </summary>    
  
public class PrintListView : ListView {    
  /// <summary>    
  /// 指示是否进行打印预览,默认值为 true    
  /// </summary>    
  private bool m_bIsPreview;    
  
  /// <summary>    
  /// 指示是否总是打印标题,默认值为 true    
  /// </summary>    
  private bool m_bIsAlwaysPrintHeader;    
  
  /// <summary>    
  /// 需要打印的页首字符串    
  /// </summary>    
  private string m_sPrintHeaderString;    
  
  /// <summary>    
  /// 标题的字体    
  /// </summary>    
  private Font m_oHeaderFont;    
  
  /// <summary>    
  /// 正文字体    
  /// </summary>    
  private Font m_oBodyFont;    
  
  /// <summary>    
  /// 页尾字体    
  /// </summary>    
  private Font m_oTailFont;    
  
  /// <summary>    
  /// 正文部分的 ColumnHeader 字体,该字体为正文字体的加粗形式    
  /// </summary>    
  private Font m_oColumnHeaderFont;    
  
  /// <summary>    
  /// 打印文档    
  /// </summary>    
  private PrintDocument m_oPrintDoc;    
  
  /// <summary>    
  /// 行间距    
  /// </summary>    
  private int m_nLineSpace ;    
  
  private int m_nPrintWidth;            // 打印区域宽度    
  
  private int m_nPrintHeight;            // 打印区域长度    
  
  private int m_nPageCount;            // 打印页数    
  
  private int m_nCurPrintPage;         // 当前正在打印的页码    
  
  private int m_nTotalPage;            // 共有的页数    
  
  private int m_nFromPage;            // 用户选择的打印起始页    
  
  private int m_nCurPrintItem;         // 当前正在打印的元素    
  
  private Rectangle  m_oHeaderRect;      // 打印页首的区域    
  
  private Rectangle  m_oBodyRect;         // 打印正文的区域    
  
  private Rectangle  m_oTailRect;         // 打印页尾的区域    
  
  private Brush defaultBrush;                
  
  private Pen   defaultPen;    
  
  /// <summary>    
  /// 设置或获取是否进行打印预览    
  /// </summary>    
  public bool IsPreview   {    
   get { return m_bIsPreview;}    
   set { m_bIsPreview = value;}    
  }    
  
  /// <summary>    
  /// 设置或获取是否总是打印标题    
  /// </summary>    
  public bool IsAlwaysPrintHeader {    
   get { return m_bIsAlwaysPrintHeader;}    
   set { m_bIsAlwaysPrintHeader = value;}    
  }    
  
  /// <summary>    
  /// 设置或获取打印的页首字符串    
  /// </summary>    
  public string PrintHeaderString {    
   get { return m_sPrintHeaderString ;}    
   set { if (value != null ) m_sPrintHeaderString = value;}    
  }    
  
  /// <summary>    
  /// 设置或获取页首字体    
  /// </summary>    
  public Font HeaderFont {    
   set { m_oHeaderFont = value;}    
   get { return m_oHeaderFont;}    
  }    
  
  /// <summary>    
  /// 设置或获取正文字体    
  /// 如果对正文字体的 Bold 属性设置为 true ,则发生 Exception 类型的异常    
  /// </summary>    
  public Font BodyFont {    
   set{    
    if ( value == null )    
     return ;    
    if (value.Bold == true ){    
     //throw new Exception ("正文字体不能进行 [加粗] 设置.");    
     MessageBox.Show("正文字体不能进行 [加粗] 设置.","警告",MessageBoxButtons.OK,MessageBoxIcon.Warning);   
     return;   
    }else{    
     m_oBodyFont = value;    
    }    
   }    
   get { return m_oBodyFont;}    
  }    
  
  /// <summary>    
  /// 设置或获取页尾字体    
  /// </summary>    
  public Font TailFont {    
   set { m_oTailFont = value;}    
   get { return m_oTailFont;}    
  }    
  
  /// <summary>    
  /// 设置或获取行间距    
  /// </summary>    
  public int LineSpace{    
   get { return m_nLineSpace;}    
   set {   
    if ( value < 0 ){    
     m_nLineSpace = 0;    
    }    
    m_nLineSpace = value;    
   }    
  }    
  
  /// <summary>    
  /// 构造函数,设置打印信息的一些默认值    
  /// </summary>    
  public PrintListView() {    
   m_bIsPreview = true;    
   m_bIsAlwaysPrintHeader = true;    
   IsAlwaysPrintHeader=true;   
   m_sPrintHeaderString = "";    
   m_oHeaderFont = null;    
   m_oTailFont = null;    
   m_oBodyFont = null;    
   m_oColumnHeaderFont = null;    
   m_oPrintDoc = null;    
   m_nPrintWidth = 0;    
   m_nPrintHeight = 0;    
   m_nPageCount = 0;    
   m_nCurPrintPage = 1;    
   m_nFromPage = 1;    
   m_nLineSpace = 0;    
   m_nCurPrintItem = 0;    
   defaultBrush = Brushes.Black ;    
   defaultPen = new Pen ( defaultBrush,1 );    
  }    
  
  /// <summary>    
  /// 初始化打印文档的属性    
  /// </summary>    
  /// <returns></returns>    
  private void InitPrintDocument () {    
   m_oPrintDoc = new PrintDocument ();    
   m_oPrintDoc.DocumentName = m_sPrintHeaderString;    
   if (m_oPrintDoc.PrinterSettings.PrinterName == "<no default printer>"){    
    //throw new Exception ("未找到默认打印机.");    
    MessageBox.Show("未找到默认打印机.","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);   
    return;   
   } else {    
    m_oPrintDoc.PrintPage +=new PrintPageEventHandler(PrintPage);    
    m_oPrintDoc.BeginPrint +=new PrintEventHandler(BeginPrint);    
    m_oPrintDoc.EndPrint +=new PrintEventHandler(EndPrint);    
   }    
  
   /* 设置打印字体 */    
   if ( m_oHeaderFont == null ){    
    m_oHeaderFont = new Font ("宋体",24,FontStyle.Bold,GraphicsUnit.World  );    
   }    
  
   if ( m_oBodyFont == null ) {    
    m_oBodyFont = new Font ("宋体",20,FontStyle.Regular ,GraphicsUnit.World  );    
   }    
  
   m_oColumnHeaderFont = new Font (m_oBodyFont,FontStyle.Bold );    
  
   if ( m_oTailFont == null ) {    
    m_oTailFont = new Font ("宋体",14,FontStyle.Regular ,GraphicsUnit.World   );    
   }    
  }    
  
  /// <summary>    
  /// 初始化打印纸张设置    
  /// </summary>    
  private bool InitPrintPage (out Margins margins) {    
   margins = null;    
   /* 获取当前 listview 的分辨率 */    
   Graphics g = this.CreateGraphics ();    
   float x = g.DpiX ;    
   g.Dispose ();    
   /* 显示纸张设置对话框 */    
   PageSetupDialog ps = new PageSetupDialog ();    
   ps.Document = m_oPrintDoc;    
      
   if ( ps.ShowDialog () == DialogResult.Cancel ) {    
    return false;    
   } else {  // 根据用户设置的纸张信息计算打印区域,计算结果的单位为 1/100 Inch    
    m_nPrintWidth = ps.PageSettings .Bounds .Width - ps.PageSettings .Margins .Left - ps.PageSettings .Margins .Right ;    
    m_nPrintHeight = ps.PageSettings .Bounds .Height - ps.PageSettings .Margins .Top - ps.PageSettings .Margins .Bottom ;       
    margins = ps.PageSettings .Margins ;    
   }    
  
   if ( m_nPrintWidth <= 0 || m_nPrintHeight <= 0 ) {    
    //throw new Exception ("纸张设置错误.");    
    MessageBox.Show("纸张设置错误.","提示",MessageBoxButtons.OK,MessageBoxIcon.Warning);   
    return false;   
   }   
  
   /* 将当前 listview 的各column的长度和转换为英寸,判断打印范围是否越界 */    
   int listViewWidth = 0;    
   for ( int i = 0 ; i < this.Columns.Count ; i ++ ) {    
    listViewWidth += this.Columns [i].Width ;    
   }    
   if ( Convert.ToInt32 ( listViewWidth / x * 100 ) > m_nPrintWidth ) {    
    //throw new Exception ("打印内容超出纸张范围 !\r\n请尝试调整纸张或纸张边距;\r\n或缩小表格各列的宽度。");    
    MessageBox.Show("打印内容超出纸张范围 !\r\n请尝试调整纸张或纸张边距;\r\n或缩小表格各列的宽度。","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);   
    return false;   
   }    
   m_oPrintDoc.DefaultPageSettings = ps.PageSettings ;    
   return true;    
  }    
  
  /// <summary>    
  /// 初始化打印页码设置    
  /// </summary>    
  private bool InitPrintPageNumber(Margins margins) {    
   /* 计算页数 */    
   int headerFontHeight = m_oHeaderFont.Height ;    
   int columnHeaderFontHeight = m_oColumnHeaderFont.Height ;    
   int bodyFontHeight = m_oBodyFont.Height ;    
   int tailFontHeight = m_oTailFont.Height ;    
   // 页首区域打印 页首字符串 以及一条横线    
   m_oHeaderRect = new Rectangle ( margins.Left ,margins.Top ,m_nPrintWidth,headerFontHeight + m_nLineSpace + 3);    
   int tailHeight = tailFontHeight + m_nLineSpace + 3;    
   // 页尾区域打印 一条横线,页码和打印时间(在同一行)    
   m_oTailRect = new Rectangle ( margins.Left ,margins.Top + m_nPrintHeight - tailHeight,m_nPrintWidth,tailHeight);    
   //正文区域为去掉页首和页尾区域的部分    
   m_oBodyRect = new Rectangle ( margins.Left ,m_oHeaderRect.Bottom + 2,m_nPrintWidth,m_oTailRect.Top - m_oHeaderRect.Bottom - 4 );    
   /* 计算第一页能打印的元素个数 */    
   int printItemPerPage = 0;    
   int firstPageItem = Convert.ToInt32 ( (m_oBodyRect.Height - columnHeaderFontHeight - m_nLineSpace) /(bodyFontHeight + m_nLineSpace ));    
   if ( firstPageItem >= this.Items .Count ){   // 需打印的元素只有一页    
    m_nPageCount = 1;    
   } else {  // 需要打印的元素有多页    
    printItemPerPage = firstPageItem;    
    int leftItems = this.Items .Count  - firstPageItem;    
    if ( m_bIsAlwaysPrintHeader == false ){    
     printItemPerPage =( m_oBodyRect.Height + m_oHeaderRect.Height + 2 - columnHeaderFontHeight - m_nLineSpace) / ( bodyFontHeight + m_nLineSpace);    
    }    
    if ( leftItems % printItemPerPage == 0 ){    
     m_nPageCount = leftItems / printItemPerPage + 1;    
    } else {    
     m_nPageCount = leftItems / printItemPerPage + 2;    
    }    
   }    
   m_nTotalPage = m_nPageCount;    
   /* 显示打印对话框 */    
   PrintDialog pd = new PrintDialog ();    
   pd.Document = m_oPrintDoc;    
   pd.PrinterSettings .MinimumPage = 1;    
   pd.PrinterSettings .MaximumPage = m_nPageCount;    
   pd.PrinterSettings .FromPage = 1;    
   pd.PrinterSettings .ToPage = m_nPageCount;    
   pd.AllowPrintToFile = false;      // 不设置打印到文件    
   if ( m_nPageCount > 1 ){    
    pd.AllowSelection = true;    
   } else  {    
    pd.AllowSelection = false ;    
   }    
   pd.AllowSomePages = true;    
   if ( pd.ShowDialog ()== DialogResult.OK ){    
    m_nPageCount = pd.PrinterSettings .ToPage - pd.PrinterSettings .FromPage + 1;    
    if ( pd.PrinterSettings .FromPage > 1 ) {    
     m_nCurPrintItem = firstPageItem + ( pd.PrinterSettings .FromPage -2 )* printItemPerPage ;    
    } else {    
     m_nCurPrintItem = 0 ;    
    }    
    m_nFromPage = pd.PrinterSettings .FromPage ;    
    m_oPrintDoc.DocumentName = m_nPageCount.ToString ();    
    m_oPrintDoc.PrinterSettings = pd.PrinterSettings ;    
    return true;    
   }else{    
    return false;    
   }    
  }    
  
  /// <summary>    
  /// 启动 ListView 的打印工作    
  /// </summary>    
  public virtual void DoPrint ( ) {    
   if ( this.Items.Count <= 0 ) {    
    //throw new Exception ("没有需要打印的元素.");    
    MessageBox.Show("没有需要打印的元素.","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);   
    return;   
   }    
      
   InitPrintDocument ();    
   Margins margins = null;    
   if (InitPrintPage( out margins ) == false )    
    return;    
  
   if ( InitPrintPageNumber( margins )== false )    
    return;    
  
   if ( m_bIsPreview == false ) {    
    m_oPrintDoc.Print ();    
   } else {    
    PrintPreviewDialog pd = new PrintPreviewDialog();     
    pd.Document = m_oPrintDoc;    
    pd.PrintPreviewControl.Zoom = 1.0;    
    pd.WindowState = FormWindowState.Maximized;    
    pd.ShowInTaskbar = true;    
    pd.ShowDialog ();                
   }    
  }    
  
  /// <summary>    
  /// 打印页首    
  /// </summary>    
  /// <param name="g"></param>    
  protected virtual void PrintPageHeader(Graphics g){    
   RectangleF textRect = new RectangleF (m_oHeaderRect.X ,m_oHeaderRect.Y ,m_oHeaderRect.Width ,m_oHeaderRect.Height - 3 );    
   CenterText(g,m_sPrintHeaderString,m_oHeaderFont,defaultBrush,textRect );    
   g.DrawLine (defaultPen,m_oHeaderRect.X ,m_oHeaderRect.Bottom -2 ,m_oHeaderRect.Right ,m_oHeaderRect.Bottom - 2);    
  }    
  
  /// <summary>    
  /// 打印正文    
  /// </summary>    
  /// <param name="g"></param>    
  protected virtual void PrintPageBody( Graphics g ) {    
   Rectangle textRect = m_oBodyRect;    
   if ( m_bIsAlwaysPrintHeader == false && m_nCurPrintPage != 1 ) {    
    textRect = new Rectangle ( m_oHeaderRect.X ,m_oHeaderRect.Y ,m_oHeaderRect.Width ,m_oHeaderRect.Height + 2 + m_oBodyRect.Height );    
   }    
  
   /* 打印标题,也就是 columnHeader */    
   int columnHeaderFontHeight = m_oColumnHeaderFont.Height ;    
   int bodyFontHeight = m_oBodyFont.Height ;    
   Rectangle columnHeaderRect = new Rectangle (textRect.X ,textRect.Y ,textRect.Width ,columnHeaderFontHeight + m_nLineSpace );    
   DrawColumnHeader(g,m_oColumnHeaderFont,defaultBrush,columnHeaderRect);    
   /* 打印元素 */    
   int itemHeight = bodyFontHeight + m_nLineSpace;    
   Rectangle itemRect;    
   int yPos = columnHeaderRect.Bottom ;    
   int printItemPerPage =  ( textRect.Height - columnHeaderRect.Height ) / ( bodyFontHeight + m_nLineSpace);    
   for ( int i = 0 ; (i < printItemPerPage) && (m_nCurPrintItem < this.Items .Count ); i ++ ) {    
    itemRect = new Rectangle (textRect.X ,yPos,textRect.Width ,itemHeight);    
    DrawItem(g,m_oBodyFont,defaultBrush,itemRect );    
    m_nCurPrintItem ++;    
    yPos += itemHeight;    
   }    
  }    
  
  /// <summary>    
  /// 打印页尾    
  /// </summary>    
  /// <param name="g"></param>    
  protected virtual void PrintPageTail ( Graphics g ){    
   g.DrawLine (defaultPen,m_oTailRect.X,m_oTailRect.Top  +1,m_oTailRect.Right ,m_oTailRect.Top  +1);    
   RectangleF textRect = new RectangleF (m_oTailRect.X ,m_oTailRect.Y+ 3 ,m_oTailRect.Width ,m_oTailRect.Height -3);    
   string text = "第 "+ m_nFromPage.ToString ()+" 页  共 "+ m_nTotalPage.ToString () + " 页";    
   m_nFromPage ++ ;    
   CenterText(g,text,m_oTailFont,defaultBrush,textRect );    
   string time = "打印时间:"+DateTime.Now.ToLongDateString ()+"   ";    
   RightText(g,time,m_oTailFont,defaultBrush,textRect);    
  }   
  
  /// <summary>    
  /// 打印一页    
  /// </summary>    
  /// <param name="sender"></param>    
  /// <param name="e"></param>    
  private void PrintPage(object sender, PrintPageEventArgs e) {    
   e.Graphics.PageUnit = GraphicsUnit.Inch;    
   e.Graphics.PageScale = .01f;    
   if ( m_bIsAlwaysPrintHeader == true ) {    
    PrintPageHeader ( e.Graphics );    
   } else {    
    if ( m_nCurPrintPage == 1 ) {    
     PrintPageHeader ( e.Graphics );    
    }    
   }    
  
   PrintPageBody( e.Graphics );    
   PrintPageTail ( e.Graphics );    
   if ( m_nCurPrintPage  == m_nPageCount ){    
    e.HasMorePages = false;    
   } else {    
    e.HasMorePages = true;    
   }    
   m_nCurPrintPage ++;    
  }    
  
  /// <summary>    
  /// 打印前的初始化设置    
  /// </summary>    
  /// <param name="sender"></param>    
  /// <param name="e"></param>    
  private void BeginPrint(object sender, PrintEventArgs e){    
   m_nCurPrintPage = 1;    
  }    
  
  /// <summary>    
  /// 打印结束后的资源释放    
  /// </summary>    
  /// <param name="sender"></param>    
  /// <param name="e"></param>    
  private void EndPrint(object sender, PrintEventArgs e) {    
  
  }    
  
  /// <summary>    
  /// 居中显示文本信息    
  /// </summary>    
  private void CenterText(Graphics g, string t, Font f, Brush b, RectangleF rect) {    
   StringFormat sf = new StringFormat();    
   sf.Alignment = StringAlignment.Center;    
   sf.LineAlignment = StringAlignment.Center;    
   g.DrawString(t, f, b, rect, sf);    
  }    
  
  /// <summary>    
  /// 居右显示文本信息    
  /// </summary>    
  private void RightText (Graphics g, string t, Font f, Brush b, RectangleF rect){    
   StringFormat sf = new StringFormat();    
   sf.Alignment = StringAlignment.Far ;    
   sf.LineAlignment = StringAlignment.Center;    
   g.DrawString(t, f, b, rect, sf);    
  }    
     
  /// <summary>    
  /// 居左显示文本信息    
  /// </summary>    
  private void LeftText (Graphics g, string t, Font f, Brush b, RectangleF rect){    
   StringFormat sf = new StringFormat();    
   sf.Alignment = StringAlignment.Near ;    
   sf.LineAlignment = StringAlignment.Center;    
   g.DrawString(t, f, b, rect, sf);    
  }    
  
  /// <summary>    
  /// 打印 listview 的 columnheader    
  /// </summary>    
  private void DrawColumnHeader ( Graphics g,Font f,Brush b,Rectangle rect ){    
   StringFormat sf = new StringFormat ();    
   sf.Alignment = StringAlignment.Center ;    
   sf.LineAlignment = StringAlignment.Center ;    
   Rectangle itemRect;    
   Point location = new Point (rect.Location.X ,rect.Location .Y  );    
   Size itemSize ;    
   for ( int i = 0 ;i < this.Columns .Count ;i ++ ){    
    itemSize = new Size (this.Columns [i].Width ,rect.Height );    
    itemRect = new Rectangle ( location,itemSize );    
    g.DrawRectangle (defaultPen,itemRect);    
    g.DrawString (this.Columns [i].Text ,f,b,itemRect,sf);    
    location.X += this.Columns [i].Width ;    
   }    
  }    
  
  /// <summary>    
  /// 打印 listview 的 item    
  /// </summary>    
  private void DrawItem ( Graphics g,Font f,Brush b,Rectangle rect ) {    
   StringFormat sf = new StringFormat ();    
   sf.Alignment = StringAlignment.Near  ;    
   sf.LineAlignment = StringAlignment.Center ;    
   Rectangle itemRect;    
   Point location = new Point (rect.Location.X ,rect.Location .Y  );    
   Size itemSize ;    
   for ( int i = 0 ;i < this.Columns .Count ;i ++ ) {    
    itemSize = new Size (this.Columns [i].Width ,rect.Height );    
    itemRect = new Rectangle ( location,itemSize );    
    g.DrawRectangle (defaultPen,itemRect);    
    g.DrawString (this.Items [m_nCurPrintItem].SubItems [i].Text  ,f,b,itemRect,sf);    
    location.X += this.Columns [i].Width ;    
   }    
  }    
}    
</span>

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值