【问题标题】:VB.net random position of numbers in textboxesVB.net 文本框中数字的随机位置
【发布时间】:2013-07-25 22:54:53
【问题描述】:

所以这只是我的问题的延续VB.Net grade distribution exercise

但我现在想做的是在单击按钮时交换或随机化它们的位置。

这就是我正在做的事情:

    If txtGrade.Text <> "" Then
        If CDbl(txtGrade.Text) Then
            txtA.Text = (CDbl(txtGrade.Text) * 40) / 100
            txtB.Text = (CDbl(txtGrade.Text) * 20) / 100
            txtC.Text = (CDbl(txtGrade.Text) * 30) / 100
            txtD.Text = (CDbl(txtGrade.Text) * 10) / 100
        End If
    End If

更新: 我把上面的代码放在 txtGrade_TextChanged 事件上

但我真的不知道如何随机化他们的位置。有任何想法吗?谢谢。

【问题讨论】:

    标签: vb.net textbox


    【解决方案1】:

    使用Random 类:(经过编辑以显示更简洁的版本)

    Dim grade As Double
    If Double.TryParse(txtGrade.Text, grade) Then
        Dim values = {(grade * 40 / 100).ToString(), (grade * 20 / 100).ToString(), (grade * 30 / 100).ToString(), (grade * 10 / 100).ToString()}
        FillRandomControlText({txtA, txtB, txtC, txtD}, values)
    End If
    

    用这个方法:

    Shared Sub FillRandomControlText(txtControls As IList(Of TextBox), values As IList(Of String))
        Dim rnd = New Random()
        Dim txt As TextBox
        Dim selectedControls = New List(Of Control)(txtControls.Count)
        For i As Int32 = 0 To txtControls.Count - 1
            Do
                txt = txtControls(rnd.Next(txtControls.Count))
            Loop While selectedControls.Contains(txt)
            selectedControls.Add(txt)
            txt.Text = values(i)
        Next
    End Sub
    

    暗淡等级为双 Dim rnd = 新随机() 昏暗控件 = {txtA, txtB, txtC, txtD} 暗淡 selectedControls = 新列表(控制) 将 txt 调暗为文本框

    If Double.TryParse(txtGrade.Text, grade) Then
        Do
            txt = controls(rnd.Next(controls.Length))
        Loop While selectedControls.Contains(txt)
        selectedControls.Add(txt)
        txt.Text = (grade * 40 / 100).ToString()
        Do
            txt = controls(rnd.Next(controls.Length))
        Loop While selectedControls.Contains(txt)
        selectedControls.Add(txt)
        txt.Text = (grade * 20 / 100).ToString()
        Do
            txt = controls(rnd.Next(controls.Length))
        Loop While selectedControls.Contains(txt)
        selectedControls.Add(txt)
        txt.Text = (grade * 30 / 100).ToString()
        Do
            txt = controls(rnd.Next(controls.Length))
        Loop While selectedControls.Contains(txt)
        txt.Text = (grade * 10 / 100).ToString()
    End If
    

    【讨论】:

    • 哎呀...看起来不太干。
    • @Neolisk:但不是真的,因为我不知道这些不同因素背后的逻辑,所以我保持原样。这需要一种方法;)
    • @Neolisk:更好? ;-)
    • 是的,类似的。为您的努力 +1。
    【解决方案2】:

    单击按钮后,您需要将要交换/随机化/随机播放的值存储到 List(Of T) 中,如下所示:

    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)
    

    【讨论】:

    • 谢谢我把 List(Of T) 放在哪里?
    • 在您的按钮的点击处理程序中或在您的点击处理程序调用的单独方法中。我会让它按照您的意愿工作,然后重构为单独的方法,并且可能是一种实用方法,可以由您的应用程序中的其他代码/页面使用。
    • 好的,但我在这里遇到了一个问题:'Length' 不是 System.Collections.Generic.List 的成员
    • 抱歉,我打字很快,脑子里放了个屁,应该是Count,而不是Length。更新了答案。
    • @Dunkey - 太好了,祝你的成绩分配练习好运。如果您觉得它对您有所帮助,请随时接受此答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 2019-09-08
    • 2010-09-06
    相关资源
    最近更新 更多