我是 vb.net 新手,正在尝试使用拉绳函数打印多个文本框的内容,如下所示
Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
Dim printFont18 = New Font("Calibri", 18, FontStyle.Bold)
Dim printFont12B = New Font("Calibri", 12, FontStyle.Bold)
Dim printFont10 = New Font("Calibri", 10)
Dim printFont10B = New Font("Calibri", 10, FontStyle.Bold)
Dim printFont11B = New Font("Calibri", 11, FontStyle.Bold)
Dim printFont12 = New Font("Calibri", 12)
Dim printFont11 = New Font("Calibri", 11)
e.Graphics.DrawString(Me.txt1.Text, printFont11, Brushes.Black, 55, 390)
e.Graphics.DrawString(Me.txt2.Text, printFont11, Brushes.Black, 385, 390)
e.Graphics.DrawString(Me.txt3.Text, printFont11, Brushes.Black, 541, 390)
e.Graphics.DrawString(Me.txt4.Text, printFont11, Brushes.Black, 595, 390)
End Sub
但是,由于我有大约 100 个文本框,我更愿意循环遍历 txt1、txt2 等,而不是编写 100 多行代码,任何帮助将不胜感激。
我尝试了各种 for-next 结构,但找不到形成“me.txt”的正确方法?拉绳结构中可接受的结构。
我...找不到形成“me.txt”的正确方法?结构
那是因为没有。你通常如何使用循环?首先,您需要一些列表来循环。其次,您使用该列表中的一个项目。没有
Me
任何东西。
由于您没有指定,我将假设您所有的
TextBoxes
都在同一个容器中。如果情况并非如此,那么事情会变得更加复杂,但仍然可行。理想情况下,您想要访问的 TextBoxes
都将位于同一个容器中,无论是表单本身、Panel
还是其他东西,并且它们将是该容器中唯一的 TextBoxes
。这样,您可以简单地循环该容器中的 TextBoxes
并获取所有它们,而无需获取其他内容。
For Each tb In myContainer.Controls.OfType(Of TextBox)()
'Use tb here.
Next
您可以将
myContainer
替换为 TextBoxes
的直接父级。就像我说的,这可能是形式本身,也可能是 Panel
、GroupBox
或其他东西。如果同一个容器中有其他 TextBoxes
,那么如果可能的话,最好添加一个 Panel
,以便您可以更轻松地隔离您想要访问的那些。每个控件都有一个包含其子控件的 Controls
属性,并且 OfType
扩展方法允许您过滤列表并排除除特定类型之外的所有控件,因此您可以排除所有不是 TextBoxes
的控件。
请注意,这将根据 z 顺序枚举控件,因此您需要确保该顺序与您想要打印的顺序相对应。根据您的命名约定,情况可能已经如此。如果不是,您应该在 VS 中打开 Document Outline 窗口,然后将
TextBoxes
拖放到正确的顺序。请注意,您还可以使用该窗口将控件移入和移出父容器。
在提供的示例中,
tb
是当前的TextBox
,因此您可以在循环中使用其Text
属性。这解决了打印什么,但你仍然需要解决在哪里打印的问题。您的代码似乎每次都使用相同的垂直位置,但水平位置正在变化。如果您不打算对这些水平位置进行硬编码,那么您需要能够在循环时计算它们。根据您使用的值,如何执行此操作并不明显,因为它似乎不是每次都添加常量偏移量的情况。如果没有可以使用的简单公式,那么您将不得不寻找另一种方法,例如将这些值添加到列表中,并在循环时获取相应的值,或者可能创建一个具有该值属性的自定义 TextBox
。但这超出了您实际提出的问题的范围,因此您应该实施您所得到的内容,如果您需要进一步的帮助,请就新主题发布新问题并提供与之相关的所有信息。