Changing Color of Textbox on Hover

H

Henry Jones

I have a VS 2005 VB.NET project and would like to change the color of the
textbox when the user hovers over it. In a Module I have the following
routines:

Public Sub Button_Hover(ByRef btnName As Button)

btnName.BackColor = Color.BlanchedAlmond

End Sub

Public Sub Button_Leave(ByRef btnName As Button)

btnName.BackColor = Color.Transparent

End Sub

----------------------------------------------



I called the routines from the following code:



Private Sub cmdTierCancel_MouseHover(ByVal sender As Object, ByVal e As
System.EventArgs) Handles cmdTierCancel.MouseHover

Button_Hover(cmdTierCancel)

End Sub

Private Sub cmdTierCancel_MouseLeave(ByVal sender As Object, ByVal e As
System.EventArgs) Handles cmdTierCancel.MouseLeave

Button_Leave(cmdTierCancel)

End Sub

---------------------------------

SO FAR SO GOOD. I thought it would be nice to use the Handles feature and
call the routine like this:

---------------------------------

Public Sub Handles_All_Buttons Handles(ByVal sender As Object, ByVal e As
System.EventArgs) cmd1.MouseHover, cmd2.MouseHover, cmd3.MouseHover

Button_Leave(sender)

End Sub



But this routine doesn't work. Can anyone tell me what I am doing wrong?



Thanks
 
T

Tim Patrick

Did you intend to call Button_Hover from your final Handles-enabled routine,
or was that just a typo?
 
C

Cor Ligthert [MVP]

Henry,

I am interested. What makes it that you think nicer to use handles instead
of .Net methods?

Cor

You want to show that you are a starting programmer or something like that?
 
H

Henry Jones

I thought it be cleaner to use one routine that handles many buttons than to
create more code. Better for maintenance later on. Am I wrong?
But that isn't the point. I would like to know how to do it, now that I
have thought of it. I don't know if it's good programming practice, but
that is what these forums are all about.

Thanks,

Henry
 
R

RobinS

In the last routine, shouldn't the Handles keyword come
after the "(ByVal sender as Object, e as EventArgs)"
and before cmd1.MouseHover, etc.?

Robin S.
------------------------------------------
 
H

Henry Jones

Yes, that was another "cut and paste" typo. In my code, it is correct.
Oops.
 
R

RobinS

Henry,

I have a routine in my base form that adds event handlers for
mouseenter and mouseleave to textboxes. This changes the backcolor
when the user enters the textbox, and changes it back when he leaves.
I learned this from Deborah Kurata book, Doing Objects in VB2005
(just to give credit where credit is due).

To do this, I cycle through the controls on my forms and
use AddHandler to add the event handlers to each control.

If I add new controls of that type to the form,
they are automatically handled.

If I remove controls from the form, that is automatically
handled; I don't need to remove them from any Handles clauses.

Also, all controls of the same type are handled the same way.

I actually have this code in a base form, and all of my forms
inherit from it. That way, I have the same behavior on every
form in my application. (As one of my old teachers used to say,
"Right or wrong, be consistent.")

Here's the code. This is recursive to handle the cases where you
have controls within controls, like textboxes within panels. I
didn't try this out, but it's almost identical to my code that
does the textboxes.

In Form_Load, add this: AddEventHandlers(me)

Private Sub AddEventHandlers(ByVal ctrlContainer As Control)
For Each ctrl As Control In ctrlContainer.Controls
If TypeOf ctrl Is Button Then
'When the MouseHover event is raised for this button,
' run the Button_Hover routine.
AddHandler ctrl.MouseHover, AddressOf Button_Hover
'When the MouseLeave event is raised for this button,
' run the Button_Leave routine.
AddHandler ctrl.MouseLeave, AddressOf Button_Leave
End If
'if control has children, call this function recursively
If ctrl.HasChildren Then
AddEventHandlers(ctrl)
End If
Next
End Sub

Public Sub Button_Hover(ByVal sender as Object, _
ByVal e as System.EventArgs)
DirectCast(sender, Control).BackColor = _
Color.BlanchedAlmond
End Sub

Public Sub Button_Leave(ByVal sender as Object, _
ByVal e as System.EventArgs)
DirectCast(sender, Control).BackColor = _
Color.Transparent
'Note: you can also change this to one of
' the known colors, like the color of
' the buttonface:
'DirectCast(sender, Control).BackColor = _
' Color.FromKnownColor(KnownColor.ButtonFace)
End Sub

What do you think?
Robin S.
 
H

Henry Jones

Hi RobinS,

The code works like a charm. Very cool. If you were here in Sunny Los
Angeles, (maybe you are....dunno) I'd buy you Starbucks Coffee.

Thanks,

Henry
 
R

RobinS

Good! I'm glad. I'm in the SF Bay Area, so it's a bit far
to drive for coffee!

Robin S.
-----------------------
 
H

Herfried K. Wagner [MVP]

Henry Jones said:
Public Sub Button_Hover(ByRef btnName As Button)
[...]
Public Sub Button_Leave(ByRef btnName As Button)

'ByRef' => 'ByVal'.
btnName.BackColor = Color.Transparent

End Sub
[...]
Public Sub Handles_All_Buttons Handles(ByVal sender As Object, ByVal e As
System.EventArgs) cmd1.MouseHover, cmd2.MouseHover, cmd3.MouseHover

Button_Leave(sender)

But this routine doesn't work. Can anyone tell me what I am doing wrong?

'Button_Leave(DirectCast(sender, Button))'.
 
H

Herfried K. Wagner [MVP]

Cor Ligthert said:
I am interested. What makes it that you think nicer to use handles instead
of .Net methods?

I feel sorry, but I do not understand what you are meaning...
 
C

Cor Ligthert [MVP]

Have a look what Robin wrote, than you understand it.
There is nothing more for me to add.

Cor
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top