PRB: Form Close Fails if Control Bound to RDC is Dirty (194980)



The information in this article applies to:

  • Microsoft Visual Basic Enterprise Edition for Windows 5.0
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0

This article was previously published under Q194980

SYMPTOMS

A form cannot be closed or unloaded.

CAUSE

If data in a control bound to a Microsoft RemoteData Control is changed and if the RDC's underlying resultset is non-updateable, then attempts to close the form will fail silently.

RESOLUTION

One way to avoid this problem is to set the Enabled property of all controls bound to an RDC to False. If edits are desired, then a command button to enable the controls can be added to the form. The controls would be disabled when the edit is committed or canceled.

Another way to avoid this problem is to add code similar to that below to the Validate event procedure for each RDC:
   Private Sub MSRDC1_Validate(Action As Integer, Reserved As Integer)
       If Action = rdActionUnload Then
           If (MSRDC1.Resultset Is Nothing) Then
               UndoEdits Me
           Else
               If (Not MSRDC1.Resultset.Updatable) Then
                   UndoEdits Me
               End If
           End If
       End If
   End Sub
				
Also add the following procedure to a standard module:
   Sub UndoEdits(frm As Form)
       Dim ctl As Control

       For Each ctl in frm.Controls
           On Error Resume Next
           If (TypeName(ctl.DataSource) = "MSRDC") Then
               If (Err = 0) Then
                   ctl.DataChanged = False
               ElseIf (Err <> 438) Then
                   MsgBox "Unexpected error!"
                   Stop
               End If
           End If
       Next ctl
   End Sub
				
The effect of this code is to cause any changes to data to be ignored when the form is being closed (rdActionUnload). It is assumed that this is the desired behavior because the resultset is non-updateable. There are two pieces of this code worth noting. If the RDC itself is not bound to data, then it is "non-updateable" with respect to the behavior described in this article. Also, error 438, "object does not support this property or method", will occur for any controls that do not support a DataChanged property. Because this code checks every control on the form, this error is expected for controls such as command buttons.

If this problem is being encountered because the RDC's LockType property is set to rdConcurReadOnly, then there is a simpler workaround than the above. Choose another value for the LockType property, and add the following code to the RDC's Validate event:
   If (Action = rdActionUpdate) Then Action = rdActionCancelUpdate
				
This problem can also be avoided by using the Microsoft ADO Data Control.

STATUS

Microsoft is researching this problem and will post new information here in the Microsoft Knowledge Base as it becomes available.

MORE INFORMATION

Steps to Reproduce Behavior

  1. Create a Standard EXE project in Visual Basic. Form1 is created by default.
  2. To the default form, add a TextBox, a CommandButton, and a RemoteData Control.
  3. Bind the RDC to some data source, and set the LockType property to rdConcurReadOnly.
  4. Bind the text box to the RDC.
  5. In the Click event of the CommandButton, set the Text property of the TextBox to some new value.
  6. Try to close the form (e.g. click on the X button at the upper-right corner), and note that the form will not close. The workarounds are as indicated above.

Modification Type:MinorLast Reviewed:1/9/2003
Keywords:kbCtrl kbprb KB194980