Previous | Index | Next 

[PRB] Column formatting via StdDataFormat objects doesn’t work for DataGrid controls

VB Migration Partner support custom formatting in bound controls. References to StdDataFormat objects are converted to VB6StdDataFormat objects and migrated VB.NET applications works like the original VB6 app. VB Migration Partner even support custom formatting by means of the Format and Unformat events of the StdDataFormat class.

However, the custom formatting mechanism works smoothly only for VB6 controls that are rendered as managed .NET controls, such as TextBox and Label. When the bound control is a wrapper around an ActiveX control, as is the case of the DataGrid control, you must edit either the original VB6 code or the migrated VB.NET code.

For example, let’s assume that the original VB6 application includes the following code:

    Dim sdf As New StdDataFormat 
    sdf.FalseValue = "Is False"
    sdf.TrueValue = "Is True"
    Set DataGrid1.Columns(1).DataFormat = sdf

The converted VB.NET code causes a compilation error because you can’t assign a VB6StdDataFormat object (defined in the control support library) to the DataFormat property exposed by columns of the DataGrid ActiveX control:

 Dim sdf As New VB6StdDataFormat()
    sdf.FalseValue = "Is False"
    sdf.TrueValue = "Is True"
    DataGrid1.Columns(1).DataFormat = sdf

You can fix this problem by passing the VB6StdDataFormat object in a ToStdDataFormat6 method:

    Dim sdf As New StdDataFormat 
    sdf.FalseValue = "Is False"
    sdf.TrueValue = "Is True"
    Set DataGrid1.Columns(1).DataFormat = ToStdDataFormat6(sdf)

The ToStdDataFormat6 is defined in the VBMigrationPartner_Support module method and does nothing under VB6. When the code is migrated to VB.NET, however, the method returns an instance of a StdDataFormat COM instance that is equivalent to the VB6StdDataFormat object defined at the top of the code snippet. After this substitution, all works as expected, including Formant and Unformat events.

Notice that the ToStdDataFormat6 method requires a reference to the Microsoft.StdFormat DLL. You can this reference manually after the migration or, better, automatically during the migration by means of an AddReference pragma.

Update: starting with VB Migration Partner 1.10, all references to the DataFormat property of DataGridColumn are migrated as references to the special DataFormat6 property, which takes and returns a VB6StdDataFormat object. For this reason, the fix described in this article is necessary only if the DataFormat property is referenced via late-binding.

 

Previous | Index | Next