【问题标题】:How to shorten code for Textbox controls如何缩短文本框控件的代码
【发布时间】:2012-08-24 19:01:01
【问题描述】:

我有 25 个文本框控件。以下代码仅适用于 2 个文本框。那么对于 25 个文本框,代码会很长,我可以缩短代码吗?

 Private Sub TextBox_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) Handles IDTextBox.KeyDown, DateDateTimePicker.KeyDown, ItemCodeTextBox.KeyDown, BrandTextBox.KeyDown, ItemTextBox.KeyDown
    If e.KeyCode = Keys.Enter And Me.IDTextBox.Focused Then
        Me.DateDateTimePicker.Focus()
    Else
        If e.KeyCode = Keys.Down And Me.IDTextBox.Focused Then
            Me.DateDateTimePicker.Focus()
        Else
            If e.KeyCode = Keys.Up And Me.DateDateTimePicker.Focused Then
                Me.IDTextBox.Focus()
            Else
                If e.KeyCode = Keys.Enter And Me.DateDateTimePicker.Focused Then
                    Me.ItemCodeTextBox.Focus()
                Else
                    If e.KeyCode = Keys.Down And Me.DateDateTimePicker.Focused Then
                        Me.ItemCodeTextBox.Focus()
                    Else
                        If e.KeyCode = Keys.Up And Me.ItemCodeTextBox.Focused Then
                            Me.DateDateTimePicker.Focus()
                        End If
                    End If
                End If
            End If

        End If
    End If

End Sub

【问题讨论】:

  • 我认为这个问题最好命名为“如何使用 ENTER 和箭头键启用 WinForms 导航”?

标签: vb.net winforms user-interface


【解决方案1】:

我假设您正在尝试使用 Enter 和箭头键启用表单导航。

如果是这样的话:

  1. 删除该代码
  2. 选择表单的设计视图
  3. 右键单击 VB 工具栏并确保“布局”工具栏可见
  4. 点击最右边名为“Tab Order”的按钮
  5. 按您想要的顺序单击每个控件
  6. 将表单的“KeyPreview”属性设置为 TRUE

然后添加以下代码:

Private Sub Form1_KeyUp(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
  If Me.ActiveControl.GetType Is GetType(DateTimePicker) Then
    'DateTimePicker
    Select Case e.KeyCode
      Case Keys.Enter
        Me.SelectNextControl(Me.ActiveControl, True, True, True, True) 'forwards
    End Select
  ElseIf Me.ActiveControl.GetType Is GetType(TextBox) AndAlso Not DirectCast(Me.ActiveControl, TextBox).Multiline Then
    'normal Textbox
    Select Case e.KeyCode
      Case Keys.Up
        Me.SelectNextControl(Me.ActiveControl, False, True, True, True)  'backwards
      Case Keys.Down, Keys.Enter
        Me.SelectNextControl(Me.ActiveControl, True, True, True, True) 'forwards
    End Select
  ElseIf Me.ActiveControl.GetType Is GetType(TextBox) AndAlso DirectCast(Me.ActiveControl, TextBox).Multiline Then
    'multiline Textbox - ignore
  Else
    'all other controls
    Select Case e.KeyCode
      Case Keys.Up
        Me.SelectNextControl(Me.ActiveControl, False, True, True, True)  'backwards
      Case Keys.Down, Keys.Enter
        Me.SelectNextControl(Me.ActiveControl, True, True, True, True) 'forwards
    End Select
  End If
End Sub

上/下箭头键实际上由 DateTimePicker 使用,因此需要将其排除为导航命令。相反,多行文本框使用 ENTER 键,因此在这种情况下必须将 ENTER 作为导航命令排除在外。

【讨论】:

  • SSS,你的代码真的很短。向上/向下箭头键实际上是由 DateTimePicker 使用的,因此需要将其作为导航控件排除在外,因为这是一个好主意。非常感谢
  • 嗨 Farook,我已经更新了代码以完全省略多行文本框。我还翻转了结构,使得顶层选择是控件的类型,内部是如何处理每个键。我希望这对你来说更容易适应,这样你就可以随心所欲地处理每个控件。
【解决方案2】:

使用“选择案例”而不是“如果”条件可以使您的代码干净。 这会干净得多。 see this link

@Farook……试试这个

Private Sub Form1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
    Select Case True
        Case (e.KeyCode = Keys.Down And Me.ActiveControl.GetType IsNot GetType(DateTimePicker))
                Me.SelectNextControl(Me.ActiveControl, True, True, True, True) 'forwards
        Case (e.KeyCode = Keys.Enter And Not (Me.ActiveControl.GetType Is GetType(TextBox) AndAlso DirectCast(Me.ActiveControl, TextBox).Multiline))
            Me.Text = Me.SelectNextControl(Me.ActiveControl, True, True, True, True).ToString  'forwards
        Case (e.KeyCode = Keys.Up And Me.ActiveControl.GetType IsNot GetType(DateTimePicker))
            Me.SelectNextControl(Me.ActiveControl, False, True, True, True)  'backwards
    End Select
End Sub

【讨论】:

  • 这种情况下不行,因为代码在比较多个变量的状态。
  • Rahil,你的代码也很短!这儿存在一个问题。当我在多行文本框上并且按向上箭头键时,光标会转到上一个文本框。我们必须取消选择多行文本框的箭头键。
  • Rahil 完成了。我添加了这一行:Me.SelectNextControl(Me.ActiveControl, False, False, False, False)。非常感谢您的支持和cmets。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多