【问题标题】:Sequence of button press in VB.NETVB.NET中的按钮按下顺序
【发布时间】:2013-11-03 14:56:04
【问题描述】:

我的 WinForm 中有多个按钮。选择一个随机顺序,并且必须按该顺序按下按钮。

我如何检测序列是否被破坏,即按钮没有按正确的顺序点击?

关键是我想知道按下某个按钮后按下了哪个按钮

Dim clicked As Boolean = False 
Private Sub Button1_Click(ByVal sender As System.Object, _
          ByVal e As System.EventArgs) Handles Button1.Click 
   clicked = True 
End Sub

【问题讨论】:

  • 你能显示你试过的代码吗?
  • 我找不到任何逻辑来执行此操作,但正在尝试以下操作: Dim clicked As Boolean = False Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 处理 Button1。 Click clicked = True End Sub
  • 你需要的不仅仅是一个被点击的标志......你需要收集一些东西来识别点击了哪个按钮,并将其保存为系列的一部分。然后将其与所需的系列顺序进行比较 - 无论是在出现故障时还是在结束时。

标签: vb.net winforms button sequence


【解决方案1】:

使所有按钮触发相同的处理程序并将 Text() 属性附加到字符串:

Private sequence As String

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles Button1.Click, Button2.Click, Button3.Click, Button4.Click, Button5.Click, _
    Button6.Click, Button7.Click, Button8.Click, Button9.Click, Button0.Click

    Dim btn As Button = DirectCast(sender, Button)
    sequence = sequence & btn.Text

    ' ... possibly do something with "sequence" ...

End Sub

【讨论】:

    【解决方案2】:

    我会保留一组按钮:

    Private buttons() As Button = { Me.Button1, Me.Button2, Me.Button3, … }
    

    你可以做一个处理程序:

    Private Sub Button_Click(sender As Object, e As EventArgs)
        ' TODO
    End Sub
    

    将处理程序添加到New() 中的按钮:

    Public Sub New()
        Me.InitializeComponent()
    
        For Each b In buttons
            AddHandler b.Click, AddressOf Button_Click
        Next
    End Sub
    

    在这样做之后(或之前),随机化buttons。然后跟踪您希望用户点击的下一个:

    Private currentButton As Integer = 0
    

    在处理程序中,检查:

    If sender Is buttons(currentButton) Then
        ' Move to the next button
        currentButton += 1
    
        ' Was that the end of them?
        If currentButton = buttons.Length Then
            ' All buttons were pressed in the right order
        End If
    Else
        ' Wrong!
    End If
    

    您可以使用列表,但如果您知道每个按钮与您已有的订单匹配,则实际上不需要跟踪按下的每个按钮。

    【讨论】:

      【解决方案3】:

      试试这个...

      您需要添加 10 个按钮(在这种情况下),并在它们的标签属性中输入数字 1 到 10...

      编辑:更聪明的方法 ;-)

      Dim lstButtonOrder As New List(Of Integer)
      Dim lstMyRandomArray As New List(Of Integer)
      
      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
          SetupArray()
      
      End Sub
      
      Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click, Button3.Click,
                                                                              Button4.Click, Button5.Click, Button6.Click,
                                                                              Button7.Click, Button8.Click, Button9.Click, Button10.Click
          Dim butPressed As Button = TryCast(sender, Button)
      
          lstButtonOrder.Add(butPressed.Tag)
      
          If lstButtonOrder.Count = lstMyRandomArray.Count Then
      
              If Enumerable.SequenceEqual(lstButtonOrder, lstMyRandomArray) = True Then
      
                  MsgBox("Well Done!")
      
              Else
      
                  MsgBox("You Fail")
      
              End If
      
              SetupArray()
      
          End If
      End Sub
      
      Private Sub SetupArray()
          Dim rnd = New Random
          lstMyRandomArray = Enumerable.Range(1, 10).OrderBy(Function(n) rnd.Next).ToList
      
          lblOrder.Text = "Please hit the buttons in this order..." & vbCrLf
      
          lstMyRandomArray.ToList().ForEach(Sub(x)
                                                lblOrder.Text &= x.ToString & " "
                                            End Sub)
      
          lstButtonOrder.Clear()
      
      End Sub
      

      当然,我可以在这里解析名称,但我更喜欢使用 tag 属性...

      【讨论】:

      • arrArray 在这里的任何地方都使用过吗?
      • 是的,我在 SetupArray 例程中随机化它。我可能已经摆脱了 1 个单个数组,但我喜欢 2...
      • 但是您将其分配给MyRandomArray。为什么不使用Enumerable.Range
      • 你当然是对的,但是我并没有太专注于公平地生成随机数组,因为 OP 有兴趣检查哪些按钮被按下...
      猜你喜欢
      • 2015-10-19
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      • 2021-11-25
      • 1970-01-01
      相关资源
      最近更新 更多