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 を使用しようとすると、エラーが発生することです。

私の質問は、モジュールで使用するフォーム テキスト ボックスを作成する方法です。

「Error'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

StringBuilderただし、その場合、効率のために、次のように a を使用する必要があります。

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)

モジュールからテキスト ボックスにアクセスできない理由については、モジュールが別のオブジェクトであるため、テキスト ボックスは完全に範囲外です。たとえば、フォームの 2 つのインスタンスを同時に表示した場合はどうなるでしょうか。このモジュールは、どのフォームのテキスト ボックスを参照しているかをどのように知るのでしょうか? これを修正する最も簡単な方法は、次のように、フォームへの参照をモジュールのメソッドに渡すことです。

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 ループの問題は、配列を 1 行で既に宣言して初期化しているため、まったく意味がないことです。

とにかくループを使用したい場合は、 a を使用し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()
于 2013-02-07T15:19:56.757 に答える