我有几个建议给你。
首先,不要使用UBound
. 这是一个旧的 VB6 函数,仅用于向后兼容。您应该改用Subjects.Length
.
接下来,当你增加i
变量时,你不需要说i = i + 1
. 您可以为此使用+=
运算符(例如i += 1
)。
但是,无论如何,您不应该在循环i
内显式递增。For
每次循环遍历循环时,循环都会自动为您增加变量。如果您在循环中自己明确地这样做,就像那样,它将跳过所有其他项目。
接下来,在这种情况下,您真的应该只使用For Each
循环,而不是迭代器:
For Each subject As String in Subjects
'...
Next
接下来,您实际上并没有在循环内将这些项目连接在一起。你应该做这样的事情:
For Each subject As String in Subjects
txtComputer.Text += subject
Next
但是,在这种情况下,为了提高效率,你真的应该使用 a StringBuilder
,像这样:
Dim builder As New StringBuilder()
For Each subject As String in Subjects
builder.Append(subject)
Next
txtComputer.Text = builder.ToString()
但是,所有这些都没有实际意义,因为您真正需要做的就是调用String.Join
:
txtComputer.Text = String.Join(", ", Subject)
至于为什么你不能从模块访问文本框,那是因为模块是一个单独的对象,所以文本框完全超出了范围。例如,如果您同时显示表单的两个实例怎么办?这个模块到底是怎么知道你指的是哪个表单的文本框?最简单的纠正方法是将表单的引用传递给模块的方法,如下所示:
Module Module1
Sub AddCourse(f As MyFormName)
f.txtComputer.Text = "Hello world"
End Sub
End Module
然后你可以从表单中调用它,如下所示:
AddCourse(Me)
但是,这将是非常糟糕的做法。理想情况下,表单代码之外的任何内容都不应直接处理表单上的任何控件。因此,更好的方法是简单地让方法返回数据,然后让表单将它自己的控件设置为返回的数据,例如:
Module Module1
Function GetCourse() As String
Return "Hello world"
End Function
End Module
然后从如下形式调用它:
txtComputer.Text = GetCourse()