WinForms + Control Inheritance Tip (or at least a Reminder)
OK, this should be a given, however since it happened to me I guess I’ll pass it along ;-)
I created a new Button
type control, so I inherited it from a System.Windows.Forms.Button
. Because I’m trying to make the screens look like a previous product, I’m using the same graphics they were using (except in picture boxes) to draw the buttons. There are two states to the button, pressed and depressed. So I Override
the OnMouseDown
and OnMouseUp
to change a member variable to let me know the current state. I also cause an Invalidate
so that the control will redraw when it can. During the OnPaint
, it uses the member variable to know what image to use. Straight forward enough and basic testing showed that it was working. (Note: Keep in mind that I worked on this control about a month ago.) Today it was time to use this control within the form I’m working on. Obviously, since it’s a button… when someone clicks it, something is supposed to happen. My Click
event was never firing. WTF?
After tracing what was going on, I discovered that I missed something. Whenever you are inheriting from a base component, in this case a Button
, and you Override
say the OnMouseDown
/ OnMouseUp
events… be sure to call upon the MyBase
versions of those methods to allow the base implementation to do it’s work as well. There are times when you may not want the base class to do anything; but in a lot of cases you do. In this example, the Click
event wasn’t working because the OnMouseDown
and OnMouseUp
were not allowing the base implementation to create the Click
event since those methods were never being called upon.
I know, probably not a true tip in the sense of the word, but hey… if it saves you some time debugging your code wondering why it’s not working as expected; I’d say it’s a tip. At least it counts as a reminder ;-)