GDI+Visual Studio .NET 2003Windows 2003.NET 1.1Windows 2000Windows XPWindows Forms中级开发Visual StudioWindows.NETC#
可打印的 ListView






4.72/5 (41投票s)
2005 年 9 月 19 日
2分钟阅读

230551

19892
一个具有打印功能的自定义 ListView 控件。
引言
在我的开发工作中,有时需要打印 ListView
控件的内容。因此,我编写了一个名为 PrintableListView
的自定义控件的代码,解决了以下两个问题:
- 当列表的宽度超过打印页面宽度时,将打印扩展到多页;
- 可选地缩小列表,使其结果宽度适应单页。
使用代码
PrintableListView
控件是从 System.Windows.Forms.ListView
派生的,因此像使用原生 ListView
控件一样使用它。额外的功能是用于打印和打印预览的功能。
// call the print method for displaying the standard print dialog.
this.m_list.Print();
// call the print preview method for displaying
// the standard print preview dialog
this.m_list.PrintPreview();
要启用“适应页面”选项,请使用控件的 FitToPage
属性。
this.m_list.FitToPage = true;
要设置出现在页面页眉上的标题,请使用控件的 Title
属性。
关注点
如果您仔细考虑 ListView
控件,您会注意到我们拥有打印它所需的所有信息,以最简单的方式。我们拥有列宽、字体、行高等等。我们所要做的就是获取所有这些信息,并在代表打印表面的 Graphics
实例上进行一些操作。以下是我解决介绍中列出的问题的方法。
多页打印
这很简单。在打印行的当前列时,我们检查是否有足够的空间来打印它。如果没有,我们将该列标记为下一页的第一个列。就这样。
适应页面
这比前一点稍微复杂一些。如果列表的总宽度大于可用空间的宽度,我们必须计算一个缩放因子,该因子由列表宽度除以可用空间得出。为了简单起见,在我的实现中,我将所有度量转换为英寸的百分之一单位。要设置缩放因子和度量单位,只需更改传递到 PrintDocument
对象的 PrintPage
事件处理程序的 Graphics
对象的坐标系即可。
private void OnPrintPage(object sender, PrintPageEventArgs e)
{
…
if (m_nStartCol==0 && m_bFitToPage && m_fListWidth>rectBody.Width)
{
// Calculate scale factor
fScale = rectBody.Width / m_fListWidth;
}
…
…
// Setting scale factor and unit of measure
g.ScaleTransform(fScale, fScale);
g.PageUnit = GraphicsUnit.Inch;
g.PageScale = 0.01f;
…
}