You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用单个MouseEnter/MouseLeave事件处理多个TextBox颜色变化?

用单个事件处理程序实现多个TextBox的鼠标悬停变色效果

核心思路

你之前的问题出在直接指定了固定的txtbox1控件,导致所有绑定该事件的控件触发时都会修改同一个控件的颜色。正确的做法是利用事件参数里的sender对象——它就是当前触发事件的那个控件,只需将其转换为TextBox类型,就能单独修改它的颜色。


方法1:通过Handles子句绑定多个控件

如果控件数量不多,可以直接在事件的Handles后面列出所有TextBox的对应事件:

Private Sub TextBox_MouseEnter(sender As Object, e As EventArgs) Handles txtbox1.MouseEnter, txtbox2.MouseEnter, txtbox3.MouseEnter
    ' 将触发事件的控件转换为TextBox类型
    Dim currentTextBox As TextBox = DirectCast(sender, TextBox)
    currentTextBox.BackColor = Color.DarkBlue
    currentTextBox.ForeColor = Color.White
End Sub

Private Sub TextBox_MouseLeave(sender As Object, e As EventArgs) Handles txtbox1.MouseLeave, txtbox2.MouseLeave, txtbox3.MouseLeave
    Dim currentTextBox As TextBox = DirectCast(sender, TextBox)
    currentTextBox.BackColor = Color.RoyalBlue
    currentTextBox.ForeColor = Color.Black
End Sub

方法2:批量绑定事件(适合大量控件)

如果TextBox数量很多,手动在Handles里列出来太麻烦,可以在窗体加载时批量遍历所有TextBox并绑定事件:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ' 遍历窗体上所有TextBox并绑定事件
    BindTextBoxEvents(Me)
End Sub

' 递归遍历所有控件(包括嵌套在容器里的TextBox)
Private Sub BindTextBoxEvents(parentControl As Control)
    For Each ctrl As Control In parentControl.Controls
        If TypeOf ctrl Is TextBox Then
            ' 绑定MouseEnter和MouseLeave事件
            AddHandler CType(ctrl, TextBox).MouseEnter, AddressOf TextBox_MouseEnter
            AddHandler CType(ctrl, TextBox).MouseLeave, AddressOf TextBox_MouseLeave
        End If
        ' 如果当前控件是容器(比如Panel、GroupBox),递归处理其子控件
        If ctrl.HasChildren Then
            BindTextBoxEvents(ctrl)
        End If
    Next
End Sub

' 通用的鼠标进入事件处理程序
Private Sub TextBox_MouseEnter(sender As Object, e As EventArgs)
    Dim currentTextBox As TextBox = DirectCast(sender, TextBox)
    currentTextBox.BackColor = Color.DarkBlue
    currentTextBox.ForeColor = Color.White
End Sub

' 通用的鼠标离开事件处理程序
Private Sub TextBox_MouseLeave(sender As Object, e As EventArgs)
    Dim currentTextBox As TextBox = DirectCast(sender, TextBox)
    currentTextBox.BackColor = Color.RoyalBlue
    currentTextBox.ForeColor = Color.Black
End Sub

注意事项

  • 如果不需要处理嵌套容器里的TextBox,可以去掉递归部分,直接遍历Me.Controls即可。
  • 转换sender时要确保它确实是TextBox类型,避免类型转换错误(建议只给TextBox绑定这些事件,不要包含按钮)。

内容的提问来源于stack exchange,提问作者Tdytech

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 04:26:11