Here’s a little goodie for readers of my blog. I have several grids that contain a checkbox column to select items in the grid. I wanted an easy, consistent way to select/deselect all checkboxes in the column, so I created a custom grid header class to do that. hdrCheckBox.zip is attached (Download).
I initially tried to use a standard checkbox. VFP doesn’t let you put a control inside a header, so I tried to overlay it on the grid. That turned out to be too flaky and limited, so I opted to use pictures of a checked and unchecked box, which VFP does do. The only downside is that the checkbox is a themed control, and Windows XP checkboxes may look slightly different than pictures of the Windows Vista checkboxes I used. Still, I think the checkbox will look good in any theme.
Another limitation is that the header cannot receive focus like a real checkbox, so no keyboard support. To get around that, the header Click() is performed when the user presses “A” while the grid column has focus. I actually tried to use Ctrl+A, but KeyPress() would not detect that combination, I assume because it’s already assigned to the Edit menu.
To make sure the user would know that they could check the box, I put a tooltip on the grid header. Header tooltips don’t work in VFP9 SP2, so I had to put some workaround code in the class to make the grid tooltip appear. Hopefully, Microsoft will eventually release a fix for this, but I’m not holding my breath.
To use the class:
- Change the column HeaderClass to hdrCheckBox in hdrCheckBox.prg. You may already be done.
- If you want the box to be checked initially, change the Value property to .T. Even though this is a PRG-based class, you can use the property sheet and override methods on the form just like you would with any class. NOTE: Setting this initial value will not check all the boxes in the grid. You will need to do that in the Grid.RecordSource query.
- If you want to change the header checkbox back to its original value (for example, if you requery the grid), then call the Reset() method on the class.
- Another VFP9 SP2 bug! If you open this form from the menu, you have to use the menu “Procedure” to open the form instead of “Command”. Otherwise, VFP9 will crash when you open the form. See Emerson Reed’s blog entry for more info.
Here are the requirements to use the class (which, of course, you could change):
- Grid.RecordSource is required.
- Column.ControlSource is required.
- The column field must be a logical field.
- Column.CurrentControl must be a checkbox.
Disclaimer: This code is provided AS-IS. If it doesn’t work for you, fix it!