65.9K
CodeProject 正在变化。 阅读更多。
Home

可打印的 ListView

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.72/5 (41投票s)

2005 年 9 月 19 日

2分钟阅读

viewsIcon

230551

downloadIcon

19892

一个具有打印功能的自定义 ListView 控件。

Demo application

List Print Preview

引言

在我的开发工作中,有时需要打印 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;
    …
}
© . All rights reserved.