VB.NET中如何在PrintPage事件处理器中遍历所有TextBox
解决VB.NET遍历TextBox批量打印的问题
针对你有近100个txt1、txt2...txt100这类TextBox需要批量打印的需求,你可以通过动态查找控件结合坐标映射的方式替代重复代码,具体实现如下:
方法1:通过控件名称+坐标数组循环处理
先把每个TextBox对应的打印X坐标整理成数组,再循环遍历索引,动态获取控件并执行打印:
Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage ' 用Using语句包裹字体,自动释放GDI资源,避免内存泄漏 Using printFont11 = New Font("Calibri", 11) ' 按txt1到txt100的顺序,填入对应的打印X坐标 Dim xPositions() As Integer = {55, 385, 541, 595, ...} ' 补充剩余96个坐标 ' 循环遍历1到100的TextBox For i As Integer = 1 To 100 ' 动态查找对应名称的控件,True表示递归搜索子容器内的控件 Dim txtBox As TextBox = DirectCast(Me.Controls.Find($"txt{i}", True).FirstOrDefault(), TextBox) ' 确认找到控件后再执行打印 If txtBox IsNot Nothing Then ' 数组索引从0开始,所以用i-1匹配对应坐标 Dim xPos As Integer = xPositions(i - 1) e.Graphics.DrawString(txtBox.Text, printFont11, Brushes.Black, xPos, 390) End If Next End Using End Sub
关键说明:
Me.Controls.Find($"txt{i}", True):通过控件名称精准查找,支持搜索子容器内的控件DirectCast(..., TextBox):将找到的控件转换为TextBox类型,避免类型错误- 坐标数组
xPositions需要你按照txt1到txt100的顺序,依次填入对应的X坐标
方法2:提前绑定控件与坐标(更易维护)
如果后续需要调整控件或坐标,这种方式更直观:
Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage Using printFont11 = New Font("Calibri", 11) ' 创建列表存储每个TextBox和对应的打印坐标 Dim printItems As New List(Of (TextBox, Integer)) From { (txt1, 55), (txt2, 385), (txt3, 541), (txt4, 595), ' 继续添加剩余的(txtN, X坐标)项 } ' 遍历列表执行打印 For Each item In printItems e.Graphics.DrawString(item.Item1.Text, printFont11, Brushes.Black, item.Item2, 390) Next End Using End Sub
额外优化提示:
- 你之前创建的多个Font对象(printFont18、printFont12B等)如果没有复用,建议都用
Using语句包裹,避免GDI资源泄漏 - 如果TextBox分布在Panel、GroupBox等子容器中,
Controls.Find的第二个参数设为True就能递归找到目标控件
内容的提问来源于stack exchange,提问作者Terry
相关产品推荐
相关产品推荐

