VB.NETでテキストファイルから一行ずつ読み込み、
静的に作られたテキストボックスに上から順に
格納するプログラムを制作しています。
しかし、下記のコードの様にFor~Each~Nextを使用すると、
読んだ一行が、何らかの順序に則って格納されてしまいます。
MSDNをみるとFor~Each~Nextは順番を予測した処理に不向きで、
For~NextやDo~Loopを使用したほうがよい場合があると書いてありましたが、
VB6と違いIndexの無い環境でFor~Nextをどう使えばよいのかわかりません。
どなたか詳しい方ご教授願います。
//コード
Dim sr As System.IO.StreamReader
sr = New System.IO.StreamReader _
(".\Test.txt", System.Text.Encoding.GetEncoding(932))
For Each Temp As Object In Me.GroupBox1.Controls
If TypeOf (Temp) Is TextBox Then
If sr.Peek > -1 Then
CType(Temp, TextBox).Text = sr.ReadLine()
End If
End If
Next
何らかの手段が存在するかどうかは知りません。が、
例え用意されてなくても好きなようにプログラムすればいいと思います。
[VB.NET]
Private GroupBox1TextBoxes() As TextBox
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim sr As System.IO.StreamReader
Dim i As Integer
'sr = New System.IO.StreamReader _
' (".\Test.txt", System.Text.Encoding.GetEncoding(932))
If Me.GroupBox1TextBoxes Is Nothing Then
Call Me.SetGroupBox1TextBoxes(Me.GroupBox1TextBoxes)
End If
If Me.GroupBox1TextBoxes Is Nothing Then Exit Sub
For i = 0 To Me.GroupBox1TextBoxes.GetUpperBound(0)
Debug.WriteLine(Me.GroupBox1TextBoxes(i).Text)
'If sr.Peek > -1 Then
' Me.GroupBox1TextBoxes(i).Text = sr.ReadLine()
'End If
Next i
End Sub
Private Sub SetGroupBox1TextBoxes(ByRef TextBoxes() As TextBox)
Dim wTextBoxIndexMax As Integer = -1
Dim wTextBoxIndex As Integer
ReDim TextBoxes(Me.GroupBox1.Controls.Count - 1)
For Each Temp As Control In Me.GroupBox1.Controls
If TypeOf (Temp) Is TextBox Then
wTextBoxIndex = DirectCast(Temp, TextBox).TabIndex
TextBoxes(wTextBoxIndex) = Temp
If wTextBoxIndexMax < wTextBoxIndex Then
wTextBoxIndexMax = wTextBoxIndex
End If
End If
Next
If wTextBoxIndexMax = -1 Then
TextBoxes = Nothing
Else
ReDim Preserve TextBoxes(wTextBoxIndexMax)
End If
End Sub
まるるうさんの一旦配列にTabIndexで順序良く格納し、
そこにアクセスするというアドバイスを元に、
Sortのあるリストで処理を実現してみました。
Private Function Comparison _
(ByVal x As TextBox, ByVal y As TextBox) As Integer
If x.TabIndex < y.TabIndex Then
Comparison = -1
ElseIf x.TabIndex > y.TabIndex Then
Comparison = 1
Else
Comparison = 0
End If
End Function
という関数を用意し、
Dim TextList As New List(Of TextBox)
For Each Temp As Object In Me.GroupBox1.Controls
If TypeOf Temp Is TextBox Then TextList.Add(CType(Temp, TextBox))
Next
TextList.Sort(AddressOf Comparison)
Dim sr As System.IO.StreamReader
sr = New System.IO.StreamReader _
(MyFolder & "\DirAdmin.txt", System.Text.Encoding.GetEncoding(932))
Dim i As Integer
For i = 0 To TextList.Count - 1
If sr.Peek <= -1 Then Exit For
TextList(i).Text = sr.ReadLine
Next
sr.Close()
と記述することで順序よくテキストを格納することに成功しました。
お付き合いくださりどうもありがとうございました。
ツイート | ![]() |