首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使多次按键事件变得更短vb.net

使多次按键事件变得更短vb.net
EN

Stack Overflow用户
提问于 2017-12-04 10:26:26
回答 2查看 107关注 0票数 3

我的表单上有很多文本框(大约70个)。我希望他们只接受十六进制值。我不得不手动为每个文本框编写KeyPress事件,这有点让人沮丧。有没有可能把这个写得更短一些?

代码语言:javascript
运行
复制
 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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-04 10:42:21

试试这个:

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

代码语言:javascript
运行
复制
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

textbox上的每一次按键操作都会调用此方法

代码语言:javascript
运行
复制
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

最后,通过删除我们在表单加载过程中定义的eventhandlers来进行清理。

代码语言:javascript
运行
复制
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

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

票数 3
EN

Stack Overflow用户

发布于 2017-12-04 11:58:48

您还可以在“TextBoxes”关键字后列出任意多个句柄;只需使用逗号将它们分隔开,如下所示:

代码语言:javascript
运行
复制
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类型的局部变量:

代码语言:javascript
运行
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47625673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档