从表单调用函数到模块

时间:2013-02-07 15:15:10

标签: vb.net

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

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”没有被声明。由于它的保护级别,它可能无法访问。“

我的问题是基于,如何修复此错误?

2 个答案:

答案 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()