使multiply keypress事件更短vb.net

时间:2017-12-04 02:26:26

标签: vb.net winforms textbox keypress

我的表单上有很多文本框(大约70个)。我希望他们只接受十六进制值。我必须手动为每个文本框编写KeyPress事件,这有点令人沮丧。是否可以缩短它?

 Private Sub TextBox66_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox66.KeyPress
        If Not "1234567890ABCDEF".Contains(Char.ToUpper(e.KeyChar)) AndAlso e.KeyChar <> vbBack Then
            e.Handled = True
        End If
    End Sub
    Private Sub TextBox65_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox65.KeyPress
        If Not "1234567890ABCDEF".Contains(Char.ToUpper(e.KeyChar)) AndAlso e.KeyChar <> vbBack Then
            e.Handled = True
        End If
    End Sub
    Private Sub TextBox64_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox64.KeyPress
        If Not "1234567890ABCDEF".Contains(Char.ToUpper(e.KeyChar)) AndAlso e.KeyChar <> vbBack Then
            e.Handled = True
        End If
    End Sub
    Private Sub TextBox63_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox63.KeyPress
        If Not "1234567890ABCDEF".Contains(Char.ToUpper(e.KeyChar)) AndAlso e.KeyChar <> vbBack Then
            e.Handled = True
        End If
    End Sub
    Private Sub TextBox62_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox62.KeyPress
        If Not "1234567890ABCDEF".Contains(Char.ToUpper(e.KeyChar)) AndAlso e.KeyChar <> vbBack Then
            e.Handled = True
        End If
    End Sub
    Private Sub TextBox61_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox61.KeyPress
        If Not "1234567890ABCDEF".Contains(Char.ToUpper(e.KeyChar)) AndAlso e.KeyChar <> vbBack Then
            e.Handled = True
        End If
    End Sub
    Private Sub TextBox52_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox52.KeyPress
        If Not "12345678".Contains(Char.ToUpper(e.KeyChar)) AndAlso e.KeyChar <> vbBack Then
            e.Handled = True
        End If
    End Sub
    Private Sub TextBox60_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox60.KeyPress
        If Not "1234567890ABCDEF".Contains(Char.ToUpper(e.KeyChar)) AndAlso e.KeyChar <> vbBack Then
            e.Handled = True
        End If
    End Sub
    Private Sub TextBox59_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox59.KeyPress
        If Not "1234567890ABCDEF".Contains(Char.ToUpper(e.KeyChar)) AndAlso e.KeyChar <> vbBack Then
            e.Handled = True
        End If
    End Sub

2 个答案:

答案 0 :(得分:3)

试试这个:

从表单加载事件创建一次eventhandler。这样就不会创建冗余代码。

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    For Each textbox As TextBox In Me.Controls.OfType(Of TextBox)
        If textbox.Name.StartsWith('TextHex') Then
           AddHandler textbox.KeyPress, AddressOf OnTextBoxKeyPress
        End If
    Next
End Sub

您的文本框上的每个按键都会调用此方法

Private Sub OnTextBoxKeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs)
    If Not "1234567890ABCDEF".Contains(Char.ToUpper(e.KeyChar)) AndAlso e.KeyChar <> vbBack Then
        e.Handled = True
    End If
End Sub

最后,通过删除在表单加载期间定义的事件处理程序来进行清理。

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    For Each textbox As TextBox In Me.Controls.OfType(Of TextBox)
        If textbox.Name.StartsWith('TextHex') Then
           RemoveHandler textbox.KeyPress, AddressOf OnTextBoxKeyPress
        End If
    Next
End Sub

如果您的文本框位于另一个控件(组框,面板)中,那么您应该将for循环中使用的范围从Me.Controls更改为(groupbox / panel的名称).Controls

答案 1 :(得分:3)

您还可以在“Handles”关键字后列出任意数量的TextBoxes;用这样的逗号分隔它们:

Private Sub TextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox52.KeyPress, TextBox59.KeyPress, TextBox60.KeyPress, TextBox61.KeyPress, TextBox62.KeyPress, TextBox63.KeyPress, TextBox64.KeyPress, TextBox65.KeyPress,TextBox66.KeyPress
    If Not "1234567890ABCDEF".Contains(Char.ToUpper(e.KeyChar)) AndAlso e.KeyChar <> vbBack Then
        e.Handled = True
    End If
End Sub

如果您需要源文本框,请将“sender”参数强制转换为TextBox类型的局部变量:

Private Sub TextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox52.KeyPress, TextBox59.KeyPress, TextBox60.KeyPress, TextBox61.KeyPress, TextBox62.KeyPress, TextBox63.KeyPress, TextBox64.KeyPress, TextBox65.KeyPress,TextBox66.KeyPress
    Dim tb As TextBox = DirectCast(sender, TextBox)
    If Not "1234567890ABCDEF".Contains(Char.ToUpper(e.KeyChar)) AndAlso e.KeyChar <> vbBack Then
        e.Handled = True
    End If
End Sub