0

我的模块中有一个数组,所以我想在表单文本框中显示数组的内容,这是我的数组

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 时出现错误。

我的问题是,如何制作要在模块中使用的表单文本框

我收到一条错误消息,内容为“未声明错误'txtComputer'。由于其保护级别,它可能无法访问。”

我的问题是基于,我该如何解决这个错误?

4

2 回答 2

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

但是,在这种情况下,为了提高效率,你真的应该使用 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()
于 2013-02-07T15:24:24.763 回答
0

您可以使用String.Join创建一个字符串来分隔每个主题Environment.NewLine

txtComputer.Text = String.Join(Environment.NewLine, Subjects)

您的 for 循环的问题在于它根本没有意义,因为您已经在一行中声明并初始化了数组。

如果您仍然想使用循环,您可以使用 aStringBuilder将所有字符串连接在一起:

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()
于 2013-02-07T15:19:56.757 回答