vb.net - 在一个处理程序中处理文本框事件
问题描述
我确实知道如何处理表单中文本框的事件。但是想让这段代码更短。让我在处理程序中停止每次 txtDraw1,2,3,4,5 的写入,并且通常将 txtDraw 的值从 1 到 8。即在包含每个 txtDraw 的句柄中,而不是手动编写它们。
Private Sub TextBoxes_TextChanged(ByVal sender As Object, ByVal e As EventArgs) Handles txtDrawA1.TextChanged, txtDrawA2.TextChanged, txtDrawA3.TextChanged, txtDrawA4.TextChanged, txtDrawA5.TextChanged, txtDrawA6.TextChanged, txtDrawA7.TextChanged, txtDrawA8.TextChanged, txtDrawB1.TextChanged, txtDrawB2.TextChanged, txtDrawB3.TextChanged, txtDrawB4.TextChanged, txtDrawB5.TextChanged, txtDrawB6.TextChanged, txtDrawB7.TextChanged, txtDrawB8.TextChanged, txtDrawC1.TextChanged, txtDrawC2.TextChanged, txtDrawC3.TextChanged, txtDrawC4.TextChanged, txtDrawC5.TextChanged, txtDrawC6.TextChanged, txtDrawC7.TextChanged, txtDrawC8.TextChanged, txtDrawD1.TextChanged, txtDrawD2.TextChanged, txtDrawD3.TextChanged, txtDrawD4.TextChanged, txtDrawD5.TextChanged, txtDrawD6.TextChanged, txtDrawD7.TextChanged, txtDrawD8.TextChanged, txtDrawE1.TextChanged, txtDrawE2.TextChanged, txtDrawE3.TextChanged, txtDrawE4.TextChanged, txtDrawE5.TextChanged, txtDrawE6.TextChanged, txtDrawE7.TextChanged, txtDrawE8.TextChanged, txtDrawF1.TextChanged, txtDrawF2.TextChanged, txtDrawF3.TextChanged, txtDrawF4.TextChanged, txtDrawF5.TextChanged, txtDrawF6.TextChanged, txtDrawF7.TextChanged, txtDrawF8.TextChanged, txtDrawG1.TextChanged, txtDrawG2.TextChanged, txtDrawG3.TextChanged, txtDrawG4.TextChanged, txtDrawG5.TextChanged, txtDrawG6.TextChanged, txtDrawG6.TextChanged, txtDrawG7.TextChanged, txtDrawG8.TextChanged, txtDrawH1.TextChanged, txtDrawH2.TextChanged, txtDrawH3.TextChanged, txtDrawH4.TextChanged, txtDrawH5.TextChanged, txtDrawH6.TextChanged, txtDrawH7.TextChanged, txtDrawH8.TextChanged, txtDrawI1.TextChanged, txtDrawI2.TextChanged, txtDrawI3.TextChanged, txtDrawI4.TextChanged, txtDrawI5.TextChanged, txtDrawI6.TextChanged, txtDrawI7.TextChanged, txtDrawI8.TextChanged
SetTextBoxColor(DirectCast(sender, TextBox))
End Sub
Sub SetTextBoxColor(ByVal txt As TextBox)
Select Case txt.Text
Case "1"
txt.BackColor = Color.DarkSalmon
Case "2"
txt.BackColor = Color.Aqua
Case "3"
txt.BackColor = Color.DimGray
Case "4"
txt.BackColor = Color.DarkBlue
Case "5"
txt.BackColor = Color.Violet
Case "6"
txt.BackColor = Color.BlueViolet
Case "7"
txt.BackColor = Color.Yellow
End Select
End Sub
解决方案
首先,您不必手动将它们写出来。您可以在设计器中选择多个控件,打开“属性”窗口,单击“事件”按钮,然后双击一个事件,为所有选定控件的该事件生成一个事件处理程序。您还可以使用事件的下拉列表来选择现有处理程序以将一个或多个控件添加到 Handles 子句。
在 VB 中注册事件处理程序有两种方法。您可以使用WithEvents
and Handles
,这就是您正在做的事情,在这种情况下,您必须在代码中包含每个标识符。这意味着您不能缩短代码并使用Handles
子句。子句的替代方法Handles
是使用AddHandler
and RemoveHandler
。这通常是通过在运行时而不是设计时创建的控件来完成的,但您也可以这样做。在您的情况下,您可以将这样的代码添加到Load
表单的事件处理程序中:
Dim letters = {"A", "B", "C", "D", "E", "F", "H", "I"}
For Each letter In letters
For n = 1 To 8
AddHandler Controls($"txtDraw{letter}{n}").TextChanged, AddressOf TextBoxes_TextChanged
Next
Next
您将在FormClosed
事件处理程序中执行相同操作,但使用RemoveHandler
而不是AddHandler
.
推荐阅读
- sql-server - SQL Server 拒绝访问公共角色
- javascript - 在 span 元素上打开 contentEditable 正在使用文本并且无法清除它
- javascript - 环境变量、PHP 和 JavaScript
- r - ShinyDashboard: Long sidebarPanel 导致dashboardBody内的MainPanel出现问题
- android - 从 Gitlab CI 中的 Appcenter 下载应用中心工件
- python - 在 SGE 集群上运行 ray (tune) 的问题
- .net - JsonConverter 在集成测试中不起作用
- ios - 当在两个观察对象视图(SwiftUI)之间的导航视图中滑回时,ForEach 消失
- html - Navbar toggler is not working in Bootstrap 5
- javascript - TypeError:无法读取未定义的属性“添加”