0

我有一个包含公司徽标的 Windows 窗体和一个列出一组记录(例如:200 条记录)的网格视图,下面是一组文本框和标签。

有没有办法打印所有东西,即带有gridview记录和文本框和标签的标志?

谢谢。

4

1 回答 1

2

是的,这是可以做到的。为了让您朝着正确的方向前进,您首先需要在表单上放置一个 PrintDocument 并连接它的 BeginPrint 和 PrintPage 事件。要使其正常工作,您可能希望打印预览而不是打印,因此您还需要一个 PrintPreviewDialog,其 Document 属性指向 PrintDocument。然后你可以调用以下来查看打印预览:

    printPreviewDialog1.ShowDialog();

我从现有的应用程序中挖出了下面的代码。

在 BeginPrint 处理程序中,您需要计算出网格的总宽度,以便在打印时可以相应地缩放它,类似于:

    totalWidth = 0;
    foreach (DataGridViewColumn col in dataGridView1.Columns)
      totalWidth += col.Width;

在 PrintPage 处理程序中,您首先需要按照下面的代码行打印列标题。您可能希望将此代码包含在主循环(如下)中以在每一页上打印列标题。

      foreach (DataGridViewColumn col in dataGridView1.Columns)
      {
        e.Graphics.DrawString(col.HeaderText,
            col.InheritedStyle.Font,
            new SolidBrush(col.InheritedStyle.ForeColor),
            new RectangleF(l, t, w, h),
            format);
      }

然后你可以打印每一行:

    while (row <= dataGridView1.Rows.Count - 1)
    {
      DataGridViewRow gridRow = dataGridView1.Rows[row];
      {
        foreach (DataGridViewCell cell in gridRow.Cells)
        {
          if (cell.Value != null)
          {
            if (cell is DataGridViewTextBoxCell)
              e.Graphics.DrawString(cell.Value.ToString(),
                  cell.InheritedStyle.Font,
                  new SolidBrush(cell.InheritedStyle.ForeColor),
                  new RectangleF(l, t, w, h),
                  format);
            else if (cell is DataGridViewImageCell)
              e.Graphics.DrawImage((Image)cell.Value,
                  new RectangleF(l, t, w, h));
          }
        }
      }
      row++;
    }

需要注意的几点:

  • 每个页面都会调用事件处理程序。您需要决定页面何时结束,并e.HasMorePages = true在适当时返回。变量“行”用于知道从下一页开始的行。您可能想要打印单元格边框
  • 您需要跟踪要打印的矩形(上面我刚刚提到了'l,t,w,h'),以便为打印的每一列调整左侧,为打印的每一行调整顶部。此外,这是您将单元格宽度乘以e.MarginBounds.Width / totalWidth缩放每个单元格的地方。
  • 我没有在上面做任何事情来保持图像的纵横比。

希望这可以帮助。

于 2012-07-03T01:03:19.353 回答