打印徽标& Windows应用程序中Gridview中的数据

时间:2012-07-01 15:50:45

标签: c# .net winforms

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

有没有办法打印所有内容,即带有gridview记录和文本框和标签的徽标?

感谢。

1 个答案:

答案 0 :(得分: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。变量'row'用于知道下一页开始的行。 您可能想要打印单元格边框
  • 您需要跟踪要打印的矩形(上面我刚才提到'l,t,w,h'),以便为每个打印的列调整左边,并为每个列调整顶部行打印。此外,这是您将单元格宽度乘以e.MarginBounds.Width / totalWidth以缩放每个单元格的位置。
  • 上面没有做任何事情来保持图像的宽高比。

希望这有帮助。