我有一个包含公司徽标的窗体和一个列出一组记录(例如:200条记录)的网格视图,下面是一组文本框和标签。
有没有办法打印所有内容,即带有gridview记录和文本框和标签的徽标?
感谢。
答案 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'用于知道下一页开始的行。
您可能想要打印单元格边框e.MarginBounds.Width / totalWidth
以缩放每个单元格的位置。希望这有帮助。