0

テキストボックス オブジェクト名でランダム シャッフル ソーターを作成しようとしています。私は8行のテキストボックス、3つのテキストボックス幅を持っています。例: 8 人の名前、電話番号、メール アドレス。これらを順番にランダムに並べ替えたいのですが、名前を付けます。電話番号と電子メール アドレスは一緒に使用する必要があります。そうしないと、情報が正確になりません。完全に機能する名前のテキストボックスのみの次のコードでこれを行うことができます。他の2行のテキストボックスを追随させるにはどうすればよいですか。GUI の例

テキストボックス テキストボックス テキストボックス ボタン
テキストボックス テキストボックス テキストボックス
テキストボックス テキストボックス テキストボックス
テキストボックス テキストボックス テキストボックス
テキストボックス テキストボックス テキストボックス
テキストボックス テキストボックス テキストボックス
テキストボックス テキストボックス テキストボックス
テキストボックス テキストボックス テキストボックス
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim ValuesToShuffle = New List(Of String)
    ValuesToShuffle.Add(txtA.Text)
    ValuesToShuffle.Add(txtB.Text)
    ValuesToShuffle.Add(txtC.Text)
    ValuesToShuffle.Add(txtD.Text)

    Dim rand = New Random()

    For counter = 0 To ValuesToShuffle.Count - 1
        Dim n = rand.Next(counter + 1)
        Dim temp = ValuesToShuffle(counter)
        ValuesToShuffle(counter) = ValuesToShuffle(n)
        ValuesToShuffle(n) = temp
    Next
    txtA.Text = ValuesToShuffle(0)
    txtB.Text = ValuesToShuffle(1)
    txtC.Text = ValuesToShuffle(2)
    txtD.Text = ValuesToShuffle(3)
4

2 に答える 2

0

もう 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」。

于 2013-09-10T13:59:13.507 に答える