You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 21:42:45