- 浏览: 184177 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
gaojingsong:
http://gaojingsong.iteye.com/bl ...
java的高精度大数字运算的问题 -
joyjiang:
弱弱的问个问题,如果你有三个域名,www.A.com;www. ...
对于一个SSO的ticket生成的安全性问题的点评 -
zhoujianboy:
zhoulieqing 写道请问,若以后面规则生成ticket ...
对于一个SSO的ticket生成的安全性问题的点评 -
zsxxsz:
这个C++ redis 库其实还是依赖的官方的 hiredis ...
Redis的C++客户端接口 -
陈加伟:
楼主,请问下,我采用该代码,使用时提示我这样的错误undefi ...
Redis的C++客户端接口
最近用C#做了个小收费系统,需要用到支持打印功能的ListView类,在网上找了一个别人的如下:
http://www.chinaaspx.com/comm/dotnetbbs/Showtopic.aspx?Forum_ID=6&Id=156821
不过用的时候发现打印的时候打出来了页首和页脚,但就打不出来表格本身。
经过跟踪,修正代码如下:
就是 protected virtual void PrintPageBody(Graphics g)函数的末尾要补上:
m_nCurPrintItem = 0; // added by Wooce
http://www.chinaaspx.com/comm/dotnetbbs/Showtopic.aspx?Forum_ID=6&Id=156821
不过用的时候发现打印的时候打出来了页首和页脚,但就打不出来表格本身。
经过跟踪,修正代码如下:
/// <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("正文字体不能进行 [加粗] 设置."); } 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; 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("未找到默认打印机."); } 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("楷体_GB2312", 16, FontStyle.Bold, GraphicsUnit.World); } if (m_oBodyFont == null) { m_oBodyFont = new Font("楷体_GB2312", 14, FontStyle.Regular, GraphicsUnit.World); } m_oColumnHeaderFont = new Font(m_oBodyFont, FontStyle.Bold); if (m_oTailFont == null) { m_oTailFont = new Font("楷体_GB2312", 12, 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("纸张设置错误."); } /* 将当前 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或缩小表格各列的宽度。"); } 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("没有需要打印的元素."); } 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; } m_nCurPrintItem = 0; // added by Wooce } /// <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; } } }
就是 protected virtual void PrintPageBody(Graphics g)函数的末尾要补上:
m_nCurPrintItem = 0; // added by Wooce
评论
1 楼
huapyuan
2012-06-26
我想在用ASP写的网页中加这个控件,可是它没有ID这个属性呀~~ PrintListView id="PrintListView" runat="server"></ccs:PrintListView>
我这样子写,可是会提示错误
Type 'ServerControls.PrintListView' does not have a public property named 'id'
可以帮忙看看这是什么问题吗?谢谢啦!!!
我这样子写,可是会提示错误
Type 'ServerControls.PrintListView' does not have a public property named 'id'
可以帮忙看看这是什么问题吗?谢谢啦!!!
相关推荐
此 `PrintListView` 类是对标准 `ListView` 类的一种扩展,旨在提供打印功能的支持。它允许用户自定义打印时的格式、字体样式以及其他与打印相关的设置。 #### 主要属性 1. **IsPreview (IsPreview)**: 一个布尔...
根据给定文件的信息,本文将深入探讨如何在C#中创建一...这不仅涉及到了继承和重写ListView类的基础知识,还包括了对打印文档、页面布局以及其他相关属性的设置。这样的实现可以极大地提高应用程序的功能性和用户体验。
控件还支持分组、排序、选择和自定义项模板等功能,使其成为展示和管理数据的强大工具。 在Windows Forms中,我们通常使用System.Drawing.Printing命名空间下的PrintDocument类来处理打印任务。PrintDocument提供了...
VB如何打印出ListView报表中的内容举例,进行ListView报表的打印输出,这在平时的使用中,是个常用功能,因此对于VB编程者来说,这是个实用的值得掌握的ListView编程技巧,通过这个VB源码,主要是演示如何将ListView...
4. **绘制ListView内容**:由于ListView控件本身不支持直接打印,我们需要手动使用Graphics对象(来自Printer对象)来绘制列表视图的内容。例如,我们可以使用Graphics.DrawString方法绘制每一项和子项的文本。 5. ...
在.NET框架中,`ListView`控件是一种常用的用户界面元素,用于显示数据集中的列表项。...通过理解并应用上述步骤,开发者能够创建一个功能完备的所见即所得的`ListView`打印解决方案,满足用户在实际应用中的需求。
这个“ListView打印预览功能实例VB源程序”很可能是为了帮助开发者实现将ListView中的数据转换为可打印的预览格式。下面将详细阐述ListView控件的基本特性和如何在VB中实现打印预览功能。 1. **ListView控件介绍** ...
本篇将详细讲解如何在VC++的单文档应用中实现ListView类型的打印功能。 首先,我们需要理解ListView的基本操作。ListView控件可以通过MFC(Microsoft Foundation Classes)库中的CListCtrl类进行封装。在CListCtrl...
在提供的文件列表中,"VB打印控件Listview使用示例"可能是一个实际的VB.NET代码示例,用于展示如何使用ListView控件并实现打印功能。文件名中的"VIP会员"、"会员服务"和"查看帮助"可能暗示这个例子是关于会员管理...
`ObjectListView.cs`可能是这个项目的核心组件,它可能是一个自定义的ListView类,扩展了.NET Framework自带的ListView控件的功能。自定义控件通常会添加额外的属性、方法或事件,以满足特定需求,比如性能优化、...
至于打印功能,Android本身并不支持直接打印ListView。但是,我们可以借助第三方库如`android-print`或`android.print`框架来实现。首先,你需要在清单文件中添加打印权限: ```xml ``` 然后,实现一个打印接口...
在提供的示例中,源码应该包含了设置ListView控件、填充数据以及调用打印功能的代码。主要涉及的函数可能包括:Form_Load事件(初始化界面)、ListView_ItemSelectionChanged事件(处理用户选择变化)和一个自定义的...
此外,它们还可能支持打印预览功能,允许用户在正式打印前检查报表的外观。 总的来说,通过使用特定的网格报表控件并结合打印控件,开发者可以在VC项目中实现高效且灵活的报表打印功能。这不仅可以提高开发效率,还...
13、多表头(跨行跨列的复杂表头)打印功能,多表头组件支持多表头显示与打印、单元格内容的合并显示、打印与导出。 14、自定义纸张支持功能。 15、直接打印窗口中的TreeView控件功能。 16、打印窗口中的ListView...
16、多表头(跨行跨列的复杂表头)打印功能,多表头组件支持多表头显示与打印、单元格内容的合并显示、打印与导出。 17、自定义纸张支持功能。 18、纸张背景图片设置打印功能。 19、.NET4.0支持功能(是单独的一个...
总之,这个VB源代码包提供了从ListView、FlexGrid等表格控件到打印设置和预览的完整解决方案,对于学习和实践VB的表格打印功能具有很高的参考价值。开发者可以通过分析和修改这些代码,以适应自己的项目需求。
在本例中,我们关注的是C/S架构中的打印功能,特别是如何在WPF(Windows Presentation Foundation)界面上设计打印样式,并通过C#后端代码来实现数据列表的打印。WPF是.NET Framework的一部分,提供了丰富的用户界面...
1、强大的DataGridView打印功能,不仅可以以多种形式(普通打印、分栏打印、跨页打印、工资条打印)打印DataGridView表格,基本上能完全按DataGridView控件本身设置的格式如字体、字号、背景颜色、前景颜色、单元格...
内容索引:VB源码,报表打印,VB打印,Listview vb编程实现LISTVIEW报表的打印功能,完成页面预览、打印内容等比例缩放、自定义页码打英支持设置纸张大孝纸张类型、纸匣数量,还可以设置页面、表格和字体、标题、页眉、...
16、多表头(跨行跨列的复杂表头)打印功能,多表头组件支持多表头显示与打印、单元格内容的合并显示、打印与导出。 17、自定义纸张支持功能。 18、纸张背景图片设置打印功能。 19、.NET4.0支持功能(是单独的一个...