我有一个包含公司徽标的 Windows 窗体和一个列出一组记录(例如:200 条记录)的网格视图,下面是一组文本框和标签。
有没有办法打印所有东西,即带有gridview记录和文本框和标签的标志?
谢谢。
是的,这是可以做到的。为了让您朝着正确的方向前进,您首先需要在表单上放置一个 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
在适当时返回。变量“行”用于知道从下一页开始的行。您可能想要打印单元格边框e.MarginBounds.Width / totalWidth
缩放每个单元格的地方。希望这可以帮助。