我的模块中有一个数组,所以我想在表单文本框中显示数组的内容,这是我的数组
Module Module1
Sub AddCourse()
Dim Subjects() = {"Ms Office 2007", "internet and commmunications", "Lifetime skills"}
For i = 0 To UBound(Subjects) ' FOR LOOP TO WRITE AN ARRAY
i = i +1
Subjects(i)
Next
txtComputer.Text = subjects()
我的问题是,当我尝试在我的模块中使用我的texbox txtComputer时,我收到错误。
我的问题是,如何在模块中使用表单文本框
我收到一条错误,上面写着“Error'txtComputer”没有被声明。由于它的保护级别,它可能无法访问。“
我的问题是基于,如何修复此错误?
答案 0 :(得分:1)
我有几个建议。
首先,不要使用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
然而,在这种情况下,为了提高效率,你真的应该使用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()
答案 1 :(得分:0)
您可以使用String.Join
创建一个字符串,用Environment.NewLine
分隔每个主题:
txtComputer.Text = String.Join(Environment.NewLine, Subjects)
for循环的问题在于它完全没有意义,因为你已经声明和在一行中初始化了数组。
如果你想要使用循环,你可以使用StringBuilder
将所有字符串连接在一起:
Dim subjectBuilder = New System.Text.StringBuilder
For Each subject In Subjects
subjectBuilder.Append(subject).Append(Environment.NewLine)
Next
If subjectBuilder.Length <> 0 Then subjectBuilder.Length -= Environment.NewLine.Length
txtComputer.Text = subjectBuilder.ToString()