DataGridView打印内容重叠问题及相关代码求助
解决DataGridView打印内容重叠问题
嘿,这问题太典型了!一眼就能看出症结——所有内容都被硬编码画在固定的Y坐标上了!每次循环打印行数据时,你都用300、310、320这些固定位置,结果每一行数据都叠在同一个区域,不重叠才怪呢。更糟的是表头居然也放在循环里,等于每打印一行就重复画一次表头,表头也会堆在一起!
问题根源拆解
你现在的代码逻辑是:循环每一行时,都在同一个Y位置画表头、分隔线、数据行,新的内容直接覆盖旧的,自然就重叠了。
修复方案
我们需要一个变量来跟踪当前的打印位置,每打印完一行就把这个位置往下挪,确保下一行内容落在新的区域。具体步骤:
- 定义
currentY变量,初始化为你想要的起始打印位置 - 把表头和分隔线的代码移到循环外面,只执行一次
- 循环打印数据时,用
currentY作为Y坐标,打印完一行后增加currentY的值(根据行高调整)
修改后的完整代码
Dim rowCount As Integer = DataGridView6.Rows.Count ' 初始化起始Y坐标,可根据你的布局需求调整 Dim currentY As Integer = 300 ' 先打印表头,只需要画一次! e.Graphics.DrawString("PARTICULARS", ReportBodyFont, Brushes.Black, 70, currentY) e.Graphics.DrawString("QTY", ReportBodyFont, Brushes.Black, 400, currentY) e.Graphics.DrawString("AMOUNT", ReportBodyFont, Brushes.Black, 600, currentY) ' 下移到分隔线位置 currentY += 10 e.Graphics.DrawString("----------------------------------------------------------", ReportFont, Brushes.Black, 50, currentY) ' 下移到第一行数据的起始位置 currentY += 10 For i = 0 To rowCount - 1 ' 处理空单元格,避免空引用异常 Dim particularsText As String = If(DataGridView6.Rows(i).Cells(1).Value IsNot Nothing, DataGridView6.Rows(i).Cells(1).Value.ToString(), "") Dim qtyText As String = If(DataGridView6.Rows(i).Cells(3).Value IsNot Nothing, DataGridView6.Rows(i).Cells(3).Value.ToString(), "") Dim amountText As String = If(DataGridView6.Rows(i).Cells(2).Value IsNot Nothing, DataGridView6.Rows(i).Cells(2).Value.ToString(), "") e.Graphics.DrawString(particularsText, ReportBodyFont, Brushes.Black, 70, currentY) e.Graphics.DrawString(qtyText, ReportBodyFont, Brushes.Blue, 400, currentY) e.Graphics.DrawString(amountText, ReportBodyFont, Brushes.Black, 600, currentY) ' 每次打印完一行,下移行高(用字体高度动态计算,适配不同字号) currentY += ReportBodyFont.Height + 5 Next
额外优化建议
- 用
ReportBodyFont.Height动态计算行高,比硬编码数字更适配不同的字体大小 - 保留空单元格的判断逻辑,避免运行时抛出
NullReferenceException - 如果数据量较大,记得补充分页逻辑,不然超出一页的内容会被截断
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

