Microsoft KB Archive/191912

= FIX: Constituent Control Validate Event Can Fail on UserControl =

Article ID: 191912

Article Last Modified on 8/7/2007

-

APPLIES TO


 * Microsoft Visual Basic 6.0 Learning Edition
 * Microsoft Visual Basic 6.0 Professional Edition
 * Microsoft Visual Basic 6.0 Enterprise Edition

-



This article was previously published under Q191912



SYMPTOMS
The Validate event of a constituent control fails to fire when you move the focus from the constituent control on a User Control to a control that is placed directly on a form.



RESOLUTION
To work around this problem, call the ValidateControls method from the LostFocus event of the User Control.



STATUS
Microsoft has confirmed that this is a bug in the Microsoft products that are listed at the beginning of this article.

This bug was corrected in Microsoft Visual Studio 6.0 Service Pack 5. For additional information about Visual Studio service packs, click the following article numbers to view the articles in the Microsoft Knowledge Base:

194022 INFO: Visual Studio 6.0 Service Packs, What, Where, Why

194295 HOWTO: Tell That a Visual Studio Service Pack Is Installed

To download the latest Visual Studio service pack, visit the following Microsoft Web site:

http://msdn2.microsoft.com/en-us/vstudio/Aa718353.aspx



MORE INFORMATION
The Validate event occurs before the focus shifts to a control that has its CausesValidation property set to True. If you are moving focus between constituent controls on a User Control, the Validate event will fire for each control. However, if you move from a constituent control on a User Control to a control that is placed directly on a form, the Validate event of the constituent control on the User Control will not fire until focus returns to a constituent control.

The workaround is to call the ValidateControls method. However, when you do this, the LostFocus for the constituent control will fire after the LostFocus event. This is the reverse of the normal event order.

Steps to Reproduce Behavior
 Start a new standard EXE project in Visual Basic. Form1 is created by default. From the Project menu, select Add User Control. Place two TextBox controls on the User Control.  Add the following code to the User Control: Private Sub Text1_LostFocus Debug.Print "text1 lostfocus" End Sub

Private Sub Text1_Validate(Cancel As Boolean) Debug.Print "text1 validate" End Sub

Private Sub Text2_LostFocus Debug.Print "text2 lostfocus" End Sub

Private Sub Text2_Validate(Cancel As Boolean) Debug.Print "text2 validate" End Sub

Private Sub UserControl_ExitFocus ' The On Error is needed because if the Validate returns a       ' False then you will receive error 380 on the ValidateControls. ' To cause the Validate event to fire when you move the focus ' from the constituent control to a control on the form, uncomment ' the following two lines: 'On Error Resume Next 'ValidateControls End Sub

Private Sub UserControl_Initialize UserControl.BackColor = RGB(0, 0, 255) End Sub

 Place a TextBox control and UserControl1 on Form1.  Add the following Code to the module of Form1: Private Sub Text1_LostFocus Debug.Print "form1 text1 lost focus" End Sub

Private Sub Text1_Validate(Cancel As Boolean) Debug.Print "form1 text1 validate" End Sub

</li> Save and run the project. Try moving focus from Text1 on the form to a TextBox on UserControl1. Then move focus from a TextBox on UserControl1 to Text1 on the form. The Validate for the TextBox on UserControl1 will not fire.</li>  To work around this bug, add the following code to the UserControl's LostFocus event: Private Sub UserControl11_LostFocus ValidateControls End Sub

</li> Save and run the project again. Note this time that the Validate event does fire from the TextBox on the UserControl.</li></ol>

Keywords: kbbug kbctrlcreate kbfix kbvs600sp5fix KB191912

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.