もう 1 つの方法は、List(Of KeyValuePair(Of String, List(Of String))) を使用することです。これで、リスト インデックスでシャッフルし、各キーに関連付けられたテキスト ボックスにテキストを追加できます。
要約すると、各人物の値を保持する何らかの構造と、シャッフル可能な人物のコレクションを保持する別の構造が必要です。これには List(Of) の作業が非常に適しています。
あなたのためにサンプルを作成していて、keyvaluepair がおそらく必要以上であることに気付いたので、より単純な List(Of List(Of String)) を使用しました。
Public Class Form1
Dim rand As New Random(Now.Millisecond)
Dim ListOfValues As New List(Of List(Of String))
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'This routine will add 2 banks of textboxes to a form. Each bank will be _
8 rows and 3 columns. The left bank will use a naming pattern starting at _
'A' and the left bank starting at 'S'. I added the name of each one to the _
text so that you can make sure the naming pattern is being followed.
For I = 0 To 7
For j = 1 To 3
AddTB(I, j, "A"c)
AddTB(I, j, "S"c)
Next
Next
End Sub
Private Sub AddTB(row As Integer, column As Integer, start As Char)
Dim tb As New TextBox
Dim offset As Integer = Math.Sign(Asc(start) - 65) * (100 + tb.Width * 3)
tb.Name = "txt" & Chr(row + Asc(start)) & column.ToString
tb.Text = tb.Name
tb.Location = New Point(((column - 1) * tb.Width) + offset, (row * tb.Height))
Me.Controls.Add(tb)
End Sub
Private Function ShuffleInfo(ValuesToShuffle As List(Of List(Of String))) As List(Of List(Of String))
'this follows the same basic routine you were using, swapping each item with a random item.
For counter = 0 To ValuesToShuffle.Count - 1
Dim n = rand.Next(0, ValuesToShuffle.Count - 1)
Dim temp As List(Of String) = ValuesToShuffle(counter)
ValuesToShuffle(counter) = ValuesToShuffle(n)
ValuesToShuffle(n) = temp
Next
ShuffleInfo = ValuesToShuffle
End Function
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'this adds the data from the textboxes to the list. each row of data is a list
'inside the list. the controls collection can be indexed by control name.
'this makes it easy to access a specific control by using a naming pattern.
For I = 0 To 7
ListOfValues.Add({Me.Controls("txt" & Chr(I + 65) & "1").Text, _
Me.Controls("txt" & Chr(I + 65) & "2").Text, _
Me.Controls("txt" & Chr(I + 65) & "3").Text}.ToList)
Next
ListOfValues = ShuffleInfo(ListOfValues)
'This fills the other textboxes with the data from the shuffled list
For I = 0 To 7
Me.Controls("txt" & Chr(I + 83) & "1").Text = ListOfValues(I)(0)
Me.Controls("txt" & Chr(I + 83) & "2").Text = ListOfValues(I)(1)
Me.Controls("txt" & Chr(I + 83) & "3").Text = ListOfValues(I)(2)
Next
End Sub
End Class
これは、行に大文字を使用し、列に数字を使用するテキストボックスの命名パターンを想定しています (つまり、「txtA3」は最初の行の 3 番目のテキストボックスです)。入力テキストボックスと同じパターンですが、シャッフルされたデータの場合は「S」。